#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 1048576;
int t[MAX_N * 2][5]; // 0 - bialy, 1 - zolty, 2 - niebieski, 3 - zielony, 4 - cokolwiek z czerwonym
int n, m, T_BASE=1;
void update(const int &node, const int &nodel, const int &noder, const int &l, const int &r, const int &k)
{
//fprintf(stderr, "update(node=%d, nodel=%d, noder=%d, l=%d, r=%d, k=%d), ", node, nodel, noder, l, r, k);
int node_range_size = noder - nodel + 1;
int fixed = -1;
for (int i=0; i<5; ++i)
if (t[node][i] == node_range_size)
fixed = i;
//fprintf(stderr, "fixed = %d\n", fixed);
if (nodel == l and r == noder and k == 4) {
for (int i=0; i<5; ++i)
t[node][i] = 0;
t[node][4] = node_range_size;
return;
}
if (0 <= fixed) {
// cale poddrzewo mialo kontakt z czerownym => nothing to do
if (fixed == 4)
return;
// cale poddrzewo jest dokladnie tego samego koloru => nothing to do
if (fixed == k)
return;
// cale poddrzewo jest zielone => tylko pomaranczowy moze je zmienic
if (fixed == 3 and k != 4)
return;
if (nodel == l and r == noder) {
// we have to update only this node
t[node][fixed] = 0;
if (k == 4)
t[node][k] = node_range_size;
else
t[node][fixed+k] = node_range_size;
return;
} else {
// trzeba "zrzucic" wartosci do poddrzewa
for (int i=0; i<5; ++i)
t[2*node][i] = t[2*node+1][i] = t[node][i] / 2;
}
}
int half = (nodel + noder) / 2; // noder of left child
if (l <= half)
update(2*node, nodel, half, l, min(half, r), k);
++half; // nodel of right child
if (half <= r)
update(2*node+1, half, noder, max(half, l), r, k);
// recalcuate t[node] using its children
for (int i=0; i<5; ++i)
t[node][i] = t[2*node][i] + t[2*node+1][i];
//fprintf(stderr, "t[%d] = (%d, %d, %d, %d, %d)\n", node, t[node][0], t[node][1], t[node][2], t[node][3], t[node][4]);
}
void init_t()
{
t[1][0] = T_BASE;
}
int main()
{
scanf("%d %d", &n, &m);
while (T_BASE < n)
T_BASE *= 2;
init_t();
int l, r, k;
while (m--) {
scanf("%d %d %d", &l, &r, &k);
if (k == 3)
k = 4;
--l; --r;
//fprintf(stderr, "(%d, %d, %d)\n", l, r, k);
update(1, 0, T_BASE-1, l, r, k);
}
printf("%d\n", t[1][3]);
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 | #include <cstdio> #include <algorithm> using namespace std; const int MAX_N = 1048576; int t[MAX_N * 2][5]; // 0 - bialy, 1 - zolty, 2 - niebieski, 3 - zielony, 4 - cokolwiek z czerwonym int n, m, T_BASE=1; void update(const int &node, const int &nodel, const int &noder, const int &l, const int &r, const int &k) { //fprintf(stderr, "update(node=%d, nodel=%d, noder=%d, l=%d, r=%d, k=%d), ", node, nodel, noder, l, r, k); int node_range_size = noder - nodel + 1; int fixed = -1; for (int i=0; i<5; ++i) if (t[node][i] == node_range_size) fixed = i; //fprintf(stderr, "fixed = %d\n", fixed); if (nodel == l and r == noder and k == 4) { for (int i=0; i<5; ++i) t[node][i] = 0; t[node][4] = node_range_size; return; } if (0 <= fixed) { // cale poddrzewo mialo kontakt z czerownym => nothing to do if (fixed == 4) return; // cale poddrzewo jest dokladnie tego samego koloru => nothing to do if (fixed == k) return; // cale poddrzewo jest zielone => tylko pomaranczowy moze je zmienic if (fixed == 3 and k != 4) return; if (nodel == l and r == noder) { // we have to update only this node t[node][fixed] = 0; if (k == 4) t[node][k] = node_range_size; else t[node][fixed+k] = node_range_size; return; } else { // trzeba "zrzucic" wartosci do poddrzewa for (int i=0; i<5; ++i) t[2*node][i] = t[2*node+1][i] = t[node][i] / 2; } } int half = (nodel + noder) / 2; // noder of left child if (l <= half) update(2*node, nodel, half, l, min(half, r), k); ++half; // nodel of right child if (half <= r) update(2*node+1, half, noder, max(half, l), r, k); // recalcuate t[node] using its children for (int i=0; i<5; ++i) t[node][i] = t[2*node][i] + t[2*node+1][i]; //fprintf(stderr, "t[%d] = (%d, %d, %d, %d, %d)\n", node, t[node][0], t[node][1], t[node][2], t[node][3], t[node][4]); } void init_t() { t[1][0] = T_BASE; } int main() { scanf("%d %d", &n, &m); while (T_BASE < n) T_BASE *= 2; init_t(); int l, r, k; while (m--) { scanf("%d %d %d", &l, &r, &k); if (k == 3) k = 4; --l; --r; //fprintf(stderr, "(%d, %d, %d)\n", l, r, k); update(1, 0, T_BASE-1, l, r, k); } printf("%d\n", t[1][3]); return 0; } |
English