线段树全WA求调
查看原帖
线段树全WA求调
684245
zhangyaiwei楼主2023/9/24 09:39
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Dian{
	int v,l,r,e,e2=1;
}ts[811111];
int n,m,M,op,x,y,k,a[111111];
int Initt(int l,int r,int I){
	ts[I].l=l,ts[I].r=r;
	if(l==r){
		ts[I].v=a[l];
		return ts[I].v;
	}
	int mid=(l+r)/2;
	ts[I].v+=Initt(l,mid,I*2);
	ts[I].v+=Initt(mid+1,r,I*2+1);
	return ts[I].v;
}
void DownL(int w){
	ts[w*2].e+=ts[w].e;
	ts[w*2].v+=ts[w].e*(ts[w*2].r-ts[w*2].l+1);
	ts[w*2+1].e+=ts[w].e;
	ts[w*2+1].v+=ts[w].e*(ts[w*2+1].r-ts[w*2+1].l+1);
	ts[w].e=0;
	ts[w*2].e2*=ts[w].e2;
	ts[w*2].v*=ts[w].e2;
	ts[w*2+1].e2*=ts[w].e2;
	ts[w*2+1].v*=ts[w].e2;
	ts[w].e2=1;
}
void Print(int x){
	int l=ts[x].l,r=ts[x].r;
	for(int i=1;i<l;i++){
		cout<<" ";
	}
	cout<<"|";
	if(l==r){
		cout<<"\n";
		return;
	}
	for(int i=l+1;i<r;i++){
		cout<<"_";
	}
	cout<<"| ("<<l<<","<<r<<")\n";
}
void cg(int w,int l,int r,int k){
	// Print(w);
	int L=ts[w].r-ts[w].l+1;
	if(ts[w].l>=l&&ts[w].r<=r){
		ts[w].v+=L*k;
		ts[w].e+=k;
		ts[w*2+1].v%=M;
		ts[w*2].v%=M;
		ts[w].v%=M;
	}
	else if(!(ts[w].l>r||ts[w].r<l)){
		DownL(w);
		ts[w*2+1].v%=M;
		ts[w*2].v%=M;
		ts[w].v%=M;
		cg(w*2,l,r,k);
		cg(w*2+1,l,r,k);
		ts[w].v=ts[w*2].v+ts[w*2+1].v;
	}
}
void cg2(int w,int l,int r,int k){
	// Print(w);
	int L=ts[w].r-ts[w].l+1;
	if(ts[w].l>=l&&ts[w].r<=r){
		ts[w].v*=k;
		ts[w].e2*=k;
		ts[w*2+1].v%=M;
		ts[w*2].v%=M;
		ts[w].v%=M;
	}
	else if(!(ts[w].l>r||ts[w].r<l)){
		DownL(w);
		ts[w*2+1].v%=M;
		ts[w*2].v%=M;
		ts[w].v%=M;
		cg2(w*2,l,r,k);
		cg2(w*2+1,l,r,k);
		ts[w].v=ts[w*2].v+ts[w*2+1].v;
	}
}
int fd(int w,int l,int r){
	// Print(w);
	int ans=0,L=ts[w].r-ts[w].l+1;
	if(ts[w].l>=l&&ts[w].r<=r){
		ts[w*2+1].v%=M;
		ts[w*2].v%=M;
		ts[w].v%=M;
		return ts[w].v;
	}
	else if(!(ts[w].l>r||ts[w].r<l)){
		DownL(w);
		ts[w*2+1].v%=M;
		ts[w*2].v%=M;
		ts[w].v%=M;
		ans+=fd(w*2,l,r);
		ans%=M;
		ans+=fd(w*2+1,l,r);
		ans%=M;
		ts[w].v=ts[w*2].v+ts[w*2+1].v;
	}
	return ans;
}
void PP(){
	cout<<"PRINT:";
	for(int i=1;i<n;i++){
		cout<<fd(1,i,i)<<",";
	}
	cout<<fd(1,n,n)<<endl;
}
signed main(){
	cin>>n>>m>>M;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	// cout<<endl;
	Initt(1,n,1);
	for(int i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			// cout<<"#1\n";
			cg2(1,x,y,k);
			// PP();
		}
		else if(op==2){
			cin>>x>>y>>k;
			// cout<<"#2\n";
			// PP();
			cg(1,x,y,k);
		}
		else{
			cin>>x>>y;
			// cout<<"#3\n";
			cout<<fd(1,x,y)%M<<endl;
		}
	}
} 
2023/9/24 09:39
加载中...