RE 0pt求调(sub1过了
查看原帖
RE 0pt求调(sub1过了
1031883
pioneer2000楼主2024/12/15 20:26
#include<bits/stdc++.h>
#define ll long long
#define ls (p<<1)
#define rs ((p<<1)|1)
#define mid ((l+r)>>1)
using namespace std;
const int N=3e5+5;
ll l,t,o,a,b,c;
char op;
struct Tree{
	ll sum,lz;
}tr[N<<2];
void push_up(ll p){
	tr[p].sum=(tr[ls].sum|tr[rs].sum);
}
void push_down(ll p,ll l,ll r){
	if(tr[p].lz){
		tr[ls].sum=(1<<tr[p].lz);
		tr[rs].sum=(1<<tr[p].lz);
		tr[ls].lz=tr[p].lz;
		tr[rs].lz=tr[p].lz;
		tr[p].lz=0;
	}
}
void build(ll l,ll r,ll p){
	if(l==r){
		tr[p].sum=(1<<1);
		return ;
	}
	build(l,mid,ls);
	build(mid+1,r,rs);
	push_up(p);
}
void update(ll l,ll r,ll le,ll ri,ll p,ll v){
	if(l==le&&r==ri){
		tr[p].sum=(1<<v);
		tr[p].lz=v;
		return ;
	}
	push_down(p,l,r);
	if(ri<=mid) update(l,mid,le,ri,ls,v);
	else if(le>mid) update(mid+1,r,le,ri,rs,v);
	else update(l,mid,le,mid,ls,v),update(mid+1,r,mid+1,ri,rs,v);
	push_up(p);
}
ll query(ll l,ll r,ll le,ll ri,ll p){
	if(l==le&&r==ri){
		return tr[p].sum;
	}
	push_down(p,l,r);
	ll ret=0;
	if(ri<=mid) ret=query(l,mid,le,ri,ls);
	else if(le>mid) ret=query(mid+1,r,le,ri,rs);
	else ret=(query(l,mid,le,mid,ls) | query(mid+1,r,mid+1,ri,rs));
	return ret;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>l>>t>>o;
	build(1,l,1);
	while(o--){
		cin>>op;
		if(op=='C'){
			cin>>a>>b>>c;
			update(1,l,a,b,1,c);
		}else{
			cin>>a>>b;
			if(a>b) swap(a,b);
			ll p=query(1,l,a,b,1),ans=0;
			for(int i=1;i<=t;i++){
				if(p&(1<<i)){
					ans++;
				}
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}
2024/12/15 20:26
加载中...