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
85
86
87
#include <iostream>
#include <stdio.h>
#include <map>
using namespace std;

int main ()
{
  int puszki, operacje; //liczba puszek, liczba operacji na nich
  scanf("%i %i", &puszki, &operacje);

  map <int,int> farby; //do pamietania stanu farb w puszkach [0 - bialy, 1 - zolty, 2 - niebieski, 3 - zielony, -1 - kazdy inny]
  map <int,int>::iterator it; //iterator po farbach
  //int itt; //do kasowanias


  //tworzymy poczatkowy stan farb
  for (int i = 0; i <= puszki; i++)
  {
    farby.emplace(i,0);
  }

  //wykonywanie operacji i liczenie puszek z zielona farba
  int licznik = 0; //licznik puszek z zielona farba
  int start, koniec, //start - zmiany od tej puszki, koniec - zmiany do tej puszki
      zmiana; //zmiana - jaki barwnik uzyto [1 - zolty, 2 - niebieski, 3 - czerwony
  for (int i = 0; i < operacje; i++)
  {
    scanf("%i %i %i", &start, &koniec, &zmiana);

    for (it = farby.lower_bound(start); it != farby.upper_bound(koniec); it++)
    {
      switch (zmiana)
      {
      case 1: //farbnik zolty
        switch (it->second)
        {
        case 0:
          it->second = 1;
          break;
        case 2:
          it->second = 3;
          licznik++;
          break;
        }
        break;
      case 2: //farbnik niebieski
        switch (it->second)
        {
        case 0:
          it->second = 2;
          break;
        case 1:
          it->second = 3;
          licznik++;
          break;
        }
        break;
      case 3: //farbnik czerwony
        switch (it->second)
        {
        case 3:
          //itt = it->first;
          //farby.erase(itt);
          it = farby.erase(it);
          it--;
          licznik--;
          //it = farby.lower_bound(itt);
          //it--;
          break;
        default:
          //itt = it->first;
          //farby.erase(itt);
          it = farby.erase(it);
          it--;
          //it = farby.lower_bound(itt);
          //it--;
        }
        break;
      }
    }
  }

  //odpowiedz
  printf("%i", licznik);

return 0;
}