同一份代码,C++20 O2 会T,但C++14 O2 能过?
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int len, root, n, q, sum[15001000], tag[15001000], lc[15001000], rc[15001000];
inline void pushup(int id) {
sum[id] = sum[lc[id]] + sum[rc[id]];
}
inline void pushdown(int id, int l, int r) {
if(tag[id] != -1) {
int mid = l + r >> 1;
if(!lc[id]) lc[id] = ++len;
if(!rc[id]) rc[id] = ++len;
sum[lc[id]] = (mid - l + 1) * tag[id], tag[lc[id]] = tag[id];
sum[rc[id]] = (r - mid) * tag[id], tag[rc[id]] = tag[id];
tag[id] = -1;
}
}
inline void adjust(int &id, int l, int r, int x, int y, int typ) {
if(!id) id = ++len;
if(y < l || x > r) return;
if(x <= l && r <= y) {
sum[id] = (r - l + 1) * typ;
tag[id] = typ;
return;
}
pushdown(id, l, r);
int mid = l + r >> 1;
if(x <= mid) adjust(lc[id], l, mid, x, y, typ);
if(mid < y) adjust(rc[id], mid + 1, r, x, y, typ);
pushup(id);
}
int l, r, k;
int main() {
memset(tag, -1, sizeof(tag));
scanf("%d %d", &n, &q);
adjust(root, 1, n, 1, n, 1);
while(q--) {
scanf("%d %d %d", &l, &r, &k);
adjust(root, 1, n, l, r, k - 1);
printf("%d\n", sum[1]);
}
//system("pause");
return 0;
}