萌新刚学OI1ms,线段树玄关求条
查看原帖
萌新刚学OI1ms,线段树玄关求条
822439
lhz2022楼主2024/9/30 22:33
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define debug() puts("I WILL AK")
#define N 100007
struct tree{
	int val,lazy;
}tr[N<<2];
int a[N];
void push_up(int rt){
	tr[rt].val=min(tr[rt<<1].val,tr[rt<<1|1].val);
}
void push_down(int rt,int l,int r){
	if(tr[rt].lazy!=0){
		tr[rt<<1].lazy^=1;
		tr[rt<<1|1].lazy^=1;
		int mid=(l+r)>>1;
		tr[rt<<1].val=mid-l+1-tr[rt<<1].val;
		tr[rt<<1|1].val=r-mid-tr[rt<<1|1].val;
		tr[rt].lazy=0;
	}
}

int query(int rt,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r) return tr[rt].val;
	push_down(rt,l,r);
	int mid=(l+r)>>1;
	if(qr<=mid)	return query(rt<<1,l,mid,ql,qr);
	if(ql>mid) return query((rt<<1)|1,mid+1,r,ql,qr);
	return query(rt<<1,l,mid,ql,qr)+query((rt<<1)|1,mid+1,r,ql,qr);
}

void update(int rt,int l,int r,int ul,int ur){
	if(ul<=l&&ur>=r){
		tr[rt].val=r-l+1-tr[rt].val;
		tr[rt].lazy^=1;
		return;
	}
	push_down(rt,l,r);
	int mid=(l+r)>>1;
	if(ul<=mid) update(rt<<1,l,mid,ul,ur);
	if(ur>mid) update((rt<<1)|1,mid+1,r,ul,ur);
	push_up(rt);
}


signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;++i){
		int op,l,r;
		cin>>op>>l>>r;
		if(op){
			cout<<query(1,1,n,l,r)<<'\n';
		}
		else{
			update(1,1,n,l,r);
		}
	}
	return 0;
}
2024/9/30 22:33
加载中...