求调
查看原帖
求调
1200401
wnqnld_llx楼主2025/6/29 17:00

样例是过了的,打样例(#!)的第一个是对的,第二个就错了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rc p<<1
#define lc p<<1|1
const int N=1e5+10;
struct edge{
	int l,r,sum,add,add2;
}t[N*4];
int w[N],n,m;
void push_down(int p){
	if(t[p].add){
		t[lc].sum+=(t[lc].r-t[lc].l+1)*t[p].add;
		t[rc].sum+=(t[rc].r-t[rc].l+1)*t[p].add;
		t[lc].add+=t[p].add;
		t[rc].add+=t[p].add;
		t[p].add=0;
	}
	if(t[p].add2){
		t[lc].sum*=t[p].add2;
		t[rc].sum*=t[p].add2;
		t[lc].add2+=t[p].add2;
		t[rc].add2+=t[p].add2;
		t[p].add2=0;
	} 
}
void push_up(int p){
	t[p].sum=t[lc].sum+t[rc].sum;
	return ;
}
void build(int p,int l,int r){
	t[p].l=l;
	t[p].r=r; 
	if(l==r){
		t[p].sum=w[l];
		return;
	}
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	push_up(p);
}
void updata(int p,int x,int y,int k){
	if(x<=t[p].l&&t[p].r<=y){
		t[p].sum+=(t[p].r-t[p].l+1)*k;
		t[p].add+=k;
		return ;
	}
	int mid=(t[p].r+t[p].l)>>1;
	push_down(p);
	if(x<=mid) updata(lc,x,y,k);
	if(y>mid) updata(rc,x,y,k);
	push_up(p);
}
void updata2(int p,int x,int y,int k){
	if(x<=t[p].l&&t[p].r<=y){
		t[p].sum*=k;
		t[p].add2+=k;
		return ;
	}
	int mid=(t[p].r+t[p].l)>>1;
	push_down(p);
	if(x<=mid) updata2(lc,x,y,k);
	if(y>mid) updata2(rc,x,y,k);
	push_up(p);
}
int q(int p,int x,int y){
	if(x<=t[p].l&&t[p].r<=y){
		return t[p].sum;
	}
	int mid=t[p].l+t[p].r>>1;
	push_down(p);
	int sm=0;
	if(x<=mid){
		sm+=q(lc,x,y);
	}
	if(y>mid){
		sm+=q(rc,x,y);
	}
	return sm;
}
signed main(){
	int v;
	cin>>n>>v>>m;
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
	build(1,1,n);
	for(int i=1;i<=v;i++){
		int in,x,y;
		cin>>in;
		if(in==1){
			int k;
			cin>>x>>y>>k;
			updata2(1,x,y,k);
		}
		if(in==2){
			int k;
			cin>>x>>y>>k;
			updata(1,x,y,k);
		}
		if(in==3){
			cin>>x>>y;
			cout<<q(1,x,y)%m<<endl;
		}
	}
	return 0;
}
2025/6/29 17:00
加载中...