样例不过求掉
查看原帖
样例不过求掉
616964
Adolfo_North楼主2024/1/29 12:18
#include<bits/stdc++.h>
using namespace std;
#define p2 (p<<1)
#define p3 (p<<1|1)
const int N=5e5+7;
struct node{
	int l,r,sum,tag;
}tr[N];
int n,m;
void pushup(int p){
	tr[p].sum=tr[p2].sum+tr[p3].sum;
}
void pushdown(int p){
	tr[p2].tag+=tr[p].tag;
	tr[p3].tag+=tr[p].tag;
	tr[p2].sum+=tr[p2].tag*(tr[p2].r-tr[p2].l+1);
	tr[p3].sum+=tr[p3].tag*(tr[p3].r-tr[p3].l+1);
	tr[p].tag=0;
}
void build(int p,int l,int r){
	tr[p].l=l,tr[p].r=r;
	if(l==r){
		tr[p].sum=0;
		return;
	}
	int mid=l+r>>1;
	build(p2,l,mid);
	build(p3,mid+1,r);
	pushup(p);
}
void upd(int p,int l,int r){
	if(tr[p].l>=l&&tr[p].r<=r){
		tr[p].sum+=(tr[p].r-tr[p].l+1);
		tr[p].tag++;
		return;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(l<=mid) upd(p2,l,r);
	if(r>mid) upd(p3,l,r);
	pushup(p);
}
bool query(int p,int x){
	if(tr[p].l==tr[p].r&&tr[p].l==x){
		return tr[p].sum&1;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid) return query(p2,x);
	if(x>mid) return query(p3,x);
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	build(1,1,n);
	while(m--){
		int op;
		cin>>op;
		if(op==1){
			int l,r;
			cin>>l>>r;
			upd(1,l,r);
		}
		else{
			int x;
			cin>>x;
			int z=query(1,x);
			cout<<z<<'\n';
		}
	}
	return 0;
}
2024/1/29 12:18
加载中...