1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <vector>

#include <stdio.h>

using namespace std;

int main()
{
    //chrono::high_resolution_clock::time_point t1 = chrono::high_resolution_clock::now();
    ios_base::sync_with_stdio(false);  // wylaczamy synchronizacje strumieni (patrz ponizej)
    cin.tie(0);
        
    int iloscFarb, iloscOperacji;
    int lFarby, pFarby, kolor;
    
    //cin >> iloscFarb;
    //cin >> iloscOperacji;
    fscanf(stdin, "%d %d\n", &iloscFarb, &iloscOperacji);

    vector <int> zoltyIndeks(iloscFarb, 0);
    vector <int> niebieskiIndeks(iloscFarb, 0);
    vector <int> czerwonyIndeks(iloscFarb, 0);
    vector <int> zolty(iloscFarb, 0);
    vector <int> niebieski(iloscFarb, 0);
    vector <int> czerwony(iloscFarb, 0);
    
    for (int i = 0; i < iloscOperacji; i++) {
        fscanf(stdin, "%d %d %d\n", &lFarby, &pFarby, &kolor);
        //cin >> lFarby >> pFarby >> kolor;
        if (kolor == 1) {
            if (lFarby == pFarby)
                zolty[lFarby - 1] = 1;
            else {
                zoltyIndeks[lFarby - 1]++;
                zoltyIndeks[pFarby - 1]--;
            }
        }
        else if (kolor == 2) {
            if (lFarby == pFarby)
                niebieski[lFarby - 1] = 1;
            else {
                niebieskiIndeks[lFarby - 1]++;
                niebieskiIndeks[pFarby - 1]--;
            }
        }
        else {
            if (lFarby == pFarby)
                czerwony[lFarby - 1] = 1;
            else {
                czerwonyIndeks[lFarby - 1]++;
                czerwonyIndeks[pFarby - 1]--;
            }
        }
    };

    int kolorZolty = 0;
    int kolorNiebieski = 0;
    int kolorCzerwony = 0;
    int iloscZielonych = 0;

    for (int i = 0; i < iloscFarb; i++) {
        kolorZolty += zoltyIndeks[i];
        kolorNiebieski += niebieskiIndeks[i];
        kolorCzerwony += czerwonyIndeks[i];
        if (kolorZolty > 0 || zoltyIndeks[i] < 0)
            zolty[i] = 1;
        if (kolorNiebieski > 0 || niebieskiIndeks[i] < 0)
            niebieski[i] = 1;
        if (kolorCzerwony > 0 || czerwonyIndeks[i] < 0)
            czerwony[i] = 1;
        if (zolty[i] == 1 && niebieski[i] == 1 && !czerwony[i])
            iloscZielonych++;
    };

    cout << iloscZielonych;

    // Some computation here
    //chrono::high_resolution_clock::time_point t2 = chrono::high_resolution_clock::now();
    //chrono::duration<double> time_span = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
    //cout << "\nIt took me " << time_span.count() << " seconds.";

    return 0;
}