全RE加未过样例,求调(悬关)
查看原帖
全RE加未过样例,求调(悬关)
910357
songzhihan2010楼主2023/11/24 20:01
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
typedef long long ll;
ll color,n,m;
struct{
	ll l,r,sum,lazy;
}t[N*4];
char op;
ll mid;
ll x,y,k;
ll ans,ans1;
void build(ll q,ll l,ll r){
	t[q].l=l;
	t[q].r=r;
	t[q].lazy=0;
	if(l==r){
		t[q].sum=1;
		return ;
	}
	mid=(l+r)/2;
	build(q*2,l,mid);
	build(q*2+1,mid+1,r);
	t[q].sum=1;
}
void sqread(ll q){
	if(t[q].lazy){
		t[q*2].sum=(1<<t[q].lazy);
		t[q*2+1].sum=(1<<t[q].lazy);
		t[q*2].lazy=t[q].lazy;
		t[q*2+1].lazy=t[q].lazy;
		t[q].lazy=0;
	}
}
void change(ll q,ll l,ll r,ll d){
	if(t[q].l>=l&&t[q].r<=r){
		t[q].lazy=d;
		t[q].sum=1<<d;
		return ;
	}
	sqread(q);
	mid=(t[q].l+t[q].r)/2;
	if(l<=mid) change(q*2,l,r,d);
	if(r>mid) change(q*2+1,l,r,d);
	t[q].sum=t[q*2].sum|t[q*2+1].sum;
}
ll ask(ll q,ll l,ll r){
	if(t[q].l>=l&&t[q].r<=r){
		return t[q].sum;
	} 
	sqread(q);
	ll ans2=0;
	mid=(l+r)/2;
	if(l<=mid) ans2|=ask(q*2,l,r);
	if(r>mid) ans2|=ask(q*2+1,l,r);
	return ans2;
} 
signed main(){
	scanf("%lld%lld%lld",&n,&color,&m);
	build(1,1,n);
	while(m--){
		cin>>op;
		if(op=='C'){
			scanf("%lld%lld%lld",&x,&y,&k);
			if(x>y) swap(x,y);
			change(1,x,y,k);
		} 
		else if(op=='P'){
			scanf("%lld%lld",&x,&y);
			if(x>y) swap(x,y);
			ans=ask(1,x,y);
			ans1=0;
			for (ll i=1;i<=color;i++){
				if(ans&(1<<i)){
					ans1++;
				}
			}
			printf("%lld\n",ans1);
		}
	}
	return 0;
}
2023/11/24 20:01
加载中...