RE9个求助
查看原帖
RE9个求助
476574
KAWorld楼主2023/7/9 14:30
#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
inline int read(){
	int s=0,t=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') t=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=s*10+c-'0';c=getchar();
	}
	return s*t;
}
inline void write(int p){
	if(p<10){
		putchar(p+'0');return;
	}
	write(p/10);putchar(p%10+'0');
}
struct node{
	int s;bool f;
}t[4*MAXN];
inline void build(int l,int r,int rt){
	t[rt].s=0;t[rt].f=false;
	if(l==r) return;
	int mid=(l+r)>>1;
	build(1,mid,rt<<1);build(mid+1,r,rt<<1|1);
}
inline void lazy(int l,int r,int rt){
	if(t[rt].f){
		int mid=(l+r)>>1;
		t[rt<<1].f=!t[rt<<1].f;
		t[rt<<1|1].f=!t[rt<<1|1].f;
		t[rt<<1].s=mid-l+1-t[rt<<1].s;
		t[rt<<1|1].s=r-mid-t[rt<<1|1].s;
		t[rt].f=!t[rt].f;
	}
}
inline void change(int l,int r,int rt,int left,int right){
	if(l>=left&&r<=right){
		t[rt].s=l-r+1-t[rt].s;t[rt].f=!t[rt].f;return;
	}
	lazy(l,r,rt);
	int mid=(l+r)>>1;
	if(left<=mid) change(l,mid,rt<<1,left,right);
	if(right>mid) change(mid+1,r,rt<<1|1,left,right);
	t[rt].s=t[rt<<1].s+t[rt<<1|1].s;
}
inline int query(int l,int r,int rt,int left,int right){
	if(l>=left&&r<=right) return t[rt].s;
	lazy(l,r,rt);
	int ans=0,mid=(l+r)>>1;
	if(left<=mid) ans+=query(l,mid,rt<<1,left,right);
	if(right>mid) ans+=query(mid+1,r,rt<<1|1,left,right);
	return ans;
}
int main(){
	int n,m,c,a,b;
	n=read();m=read();
	build(1,n,1);
	for(register int i=1;i<=m;++i){
		c=read();a=read();b=read();
		if(!c) change(1,n,1,a,b);
		else{
			write(query(1,n,1,a,b));putchar('\n');
		}
	}
	return 0;
}

2023/7/9 14:30
加载中...