线段树样例过了求调(玄关)
查看原帖
线段树样例过了求调(玄关)
544310
wuhupai楼主2023/10/20 18:12
#include <bits/stdc++.h>
using namespace std;
long long l,t,T,x,y,z,d[400005],la[400005];
char op;
void push_up(long long p){
	d[p]=d[p<<1]|d[p<<1|1];
}
void push_down(long long p,long long l,long long r,long long mid){
	if(la[p]!=0){
		d[p<<1]=d[p<<1|1]=la[p<<1|1]=la[p<<1]=la[p];
		la[p]=0;
	}
}
void build(long long l,long long r,long long p){
	if(l==r){
		d[p]=1;
		return;
	}
	long long mid=(l+r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	push_up(p);
}
void update(long long l,long long r,long long p,long long ad,long long s,long long t){
	if(l>=s&&r<=t){
		la[p]=d[p]=ad;
		return;
	}
	long long mid=(l+r)>>1;
	push_down(p,l,r,mid);
	if(s<=mid) update(l,mid,p<<1,ad,s,t);
	if(t>mid) update(mid+1,r,p<<1|1,ad,s,t);
	push_up(p);
}
long long getsum(long long l,long long r,long long p,long long s,long long t){
	if(l>=s&&r<=t){
		return d[p];
	}
	long long mid=(l+r)>>1,ans=0;
	push_down(p,l,r,mid);
	if(s<=mid) ans=ans|getsum(l,mid,p<<1,s,t);
	if(t>mid) ans=ans|getsum(mid+1,r,p<<1|1,s,t);
	return ans;
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>l>>t>>T;
    build(1,l,1);
    while(T--){
    	cin>>op;
    	if(op=='C'){
    		cin>>x>>y>>z;
			if(x>y) swap(x,y);
    		update(1,l,1,1<<z,x,y);
		}
		if(op=='P'){
			cin>>x>>y;
			if(x>y) swap(x,y);
			long long tot=0,z=getsum(1,l,1,x,y);
			for(int i=0;i<=t;i++) if(z&(1<<i)) tot++;
			cout<<tot<<endl;
		}
	}
    
    return 0;
}
2023/10/20 18:12
加载中...