开 O2 RE + MLE,不开 O2 AC


代码
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define ul unsigned long long
using namespace std;
int a[600000], b[600000], d[600000];
int n, m;
int pushdown(int l, int r, int p) {
int m = (l + r) / 2;
//l -> m, m + 1 -> r
d[p * 2] += (m - l + 1) * b[p];
d[p * 2 + 1] += (r - m) * b[p];
b[p * 2] += b[p];
b[p * 2 + 1] += b[p];
b[p] = 0;
}
void add(int l, int r, int s, int t, int p) {
if (l <= s && t <= r) {
d[p] += (t - s + 1);
++b[p];
return;
}
if (s != t) pushdown(s, t, p);
int m = (s + t) / 2;
if (l <= m) add(l, r, s, m, p * 2);
if (m < r) add(l, r, m + 1, t, p * 2 + 1);
}
int _q(int l, int r, int x, int p) {
if (l == r) {
return d[p];
}
if (l != r) pushdown(l, r, p);
int m = (l + r) / 2;
if (x <= m) return _q(l, m, x, p * 2);
else return _q(m + 1, r, x, p * 2 + 1);
}
int main() {
scanf ("%d%d", &n, &m);
// for (int i = 1; i <= n; ++i) scanf ("%d", &a[i]);
for (int i = 1; i <= m; ++i) {
int op, L, R, x;
scanf ("%d", &op);
if (op == 1) {
scanf ("%d%d", &L, &R);
add(L, R, 1, n, 1);
// for(int j=1;j<=n;++j)cout<<_q(1,n,j,1)<<' ';
// cout<<endl;
} else {
scanf ("%d", &x);
printf ("%d\n", _q(1, n, x, 1) % 2);
}
}
}