xdm求调
查看原帖
xdm求调
595098
weiyiqian楼主2024/11/25 00:12

只A了#2 QAQ

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
struct Node{
	int l,r,sum;
	int st;
}tr[N*4];
int n,m;
void pushup(int u){
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void pushdown(int u){
	if(!tr[u].st) return;
	Node &left=tr[u<<1],&right=tr[u<<1|1];
	left.sum=left.r-left.l+1-left.sum;
	right.sum=right.r-right.l+1-right.sum;
	left.st^=1;
	right.st^=1;
	tr[u].st=0;
}
void build(int u,int l,int r){
	tr[u]={l,r};
	if(l==r) return;
	int mid=l+r>>1;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
void modify(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r){
		tr[u].st^=1;
		tr[u].sum=tr[u].r-tr[u].l+1-tr[u].sum;
	}
	else{
		pushdown(u);
		int mid=tr[u].l+tr[u].r>>1;
		if(l<=mid) modify(u<<1,l,mid);
		if(r>mid) modify(u<<1|1,mid+1,r);
		pushup(u);
	}
}
int query(int u,int l, int r){
	if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;
	int mid=tr[u].l+tr[u].r>>1;
	int v=0;
	pushdown(u);
	if(l<=mid) v=query(u<<1,l,mid);
	if(r>mid) v+=query(u<<1|1,mid+1,r);
	return v;
}
int main(){
	cin>>n>>m;
	build(1,1,n);
	while(m--){
		int c,a,b;
		cin>>c>>a>>b;
		if(!c){
			modify(1,a,b);
		}else{
			cout<<query(1,a,b)<<endl;
		}
	}
	return 0;
}
2024/11/25 00:12
加载中...