线段树10pts求调
查看原帖
线段树10pts求调
649114
50lty12楼主2023/3/19 14:31
#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
using namespace std;
const int N=1e5+5;
int op,x,y,k,n,m;
struct Segment_tree{
	int l,r,sum,add;
}tr[4*N];
void pushup(int p){
	tr[p].sum=tr[lc].sum+tr[rc].sum;
}
void pushdown(int p){
	if(tr[p].add){
		tr[lc].sum+=(tr[lc].r-tr[lc].l+1);
		tr[rc].sum+=(tr[rc].r-tr[rc].l+1);
		tr[lc].add+=tr[p].add;
		tr[rc].add+=tr[p].add;
		tr[p].add=0;
	}
}
void build(int p,int l,int r){
	tr[p].l=l,tr[p].r=r,tr[p].add=0;
	if(l==r){
		tr[p].sum=0;
		return;
	}
	int mid=l+r>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(p);
}
void change(int p,int x,int y){
	if(tr[p].l>=x && tr[p].r<=y){
		tr[p].add++;
		tr[p].sum+=(tr[p].r-tr[p].l+1);
		return;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid) change(lc,x,y);
	if(y>mid) change(rc,x,y);
	pushup(p);
}
int query(int p,int k){
//	printf("%d %d\n",p,k);
	if(tr[p].l==k && tr[p].r==k){
		return tr[p].sum;
	}
	int mid=tr[p].l+tr[p].r>>1;
	pushdown(p);
	if(k<=mid) return query(lc,k);
	else return query(rc,k);
}
int main(){
	scanf("%d%d",&n,&m);
	build(1,1,n);
	while(m--){
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d",&x,&y);
			change(1,x,y);
		}
		else{
			scanf("%d",&k);
			printf("%d\n",query(1,k)&1);
		}
	}
	return 0;
}

悬关,万分感谢!

2023/3/19 14:31
加载中...