玄学(?
查看原帖
玄学(?
335771
cjWYZtql楼主2023/7/9 16:31

开 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);
		}
	}
} 
2023/7/9 16:31
加载中...