#include <iostream>
using namespace std;
int* tab = new int[1 << 21]();
int M = (1 << 20) - 1;
void co(int p, int w)
{
if (tab[p] == 0)
tab[p] = w;
else if (tab[p] == 3 && w == 4)
tab[p] += w;
else if (tab[p] == 1 && w == 2)
tab[p] += w;
else if (tab[p] == 2 && w == 1)
tab[p] += w;
if (w == 4)
tab[p] += 4;
}
void wstaw(int p, int k, int w)
{
co(p, w);
co(k, w);
while (p/2 <k/2)
{
if (p % 2 == 1)
{ if(((p/2)+1)<k/2)
co((p / 2) + 1, w);
p++;
}
else
co(p / 2, w);
if (k % 2 == 1)
co(k / 2, w);
else
{ if (((k / 2) - 1) >p /2-1)
co((k / 2) - 1, w);
k--;
}
k /= 2;
p /= 2;
}
}
bool spr(int p)
{
int ta[5] = {};
while (p != 1)
{
if (tab[p] == 1) ta[1]++;
if (tab[p] == 2) ta[2]++;
if (tab[p] == 3) ta[3]++;
if (tab[p] > 3) ta[4]++;
p /= 2;
}
if (ta[4] > 0) return false;
else if (ta[3] > 0) return true;
else if (ta[1] > 0 && ta[2] > 0) return true;
else return false;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
int puszek, t,sum=0;
cin >> puszek >> t;
for (int i = 0; i < t; i++)
{
int p, k, farba;
cin >> p >> k >> farba;
if (farba == 3)
wstaw(M + p, M + k, 4);
else
wstaw(M + p, M + k, farba);
}
for (int i = 1; i <= puszek; i++)
{
if (spr(M + i))
sum++;
}
cout << sum;
return 0;
}
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <iostream> using namespace std; int* tab = new int[1 << 21](); int M = (1 << 20) - 1; void co(int p, int w) { if (tab[p] == 0) tab[p] = w; else if (tab[p] == 3 && w == 4) tab[p] += w; else if (tab[p] == 1 && w == 2) tab[p] += w; else if (tab[p] == 2 && w == 1) tab[p] += w; if (w == 4) tab[p] += 4; } void wstaw(int p, int k, int w) { co(p, w); co(k, w); while (p/2 <k/2) { if (p % 2 == 1) { if(((p/2)+1)<k/2) co((p / 2) + 1, w); p++; } else co(p / 2, w); if (k % 2 == 1) co(k / 2, w); else { if (((k / 2) - 1) >p /2-1) co((k / 2) - 1, w); k--; } k /= 2; p /= 2; } } bool spr(int p) { int ta[5] = {}; while (p != 1) { if (tab[p] == 1) ta[1]++; if (tab[p] == 2) ta[2]++; if (tab[p] == 3) ta[3]++; if (tab[p] > 3) ta[4]++; p /= 2; } if (ta[4] > 0) return false; else if (ta[3] > 0) return true; else if (ta[1] > 0 && ta[2] > 0) return true; else return false; } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); int puszek, t,sum=0; cin >> puszek >> t; for (int i = 0; i < t; i++) { int p, k, farba; cin >> p >> k >> farba; if (farba == 3) wstaw(M + p, M + k, 4); else wstaw(M + p, M + k, farba); } for (int i = 1; i <= puszek; i++) { if (spr(M + i)) sum++; } cout << sum; return 0; } |
English