样例不过求调
查看原帖
样例不过求调
616964
Adolfo_North楼主2023/8/25 12:57

RT,输出7,25,疑似是query的问题

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define p2 p<<1
#define p3 p<<1|1
const int N=1e5+1;
int n,m,mod;
int a[N];
struct node{
	int l,r,w,tadd,tmul;
}tr[N<<2];
void pushup(int p){
	tr[p].w=(tr[p2].w+tr[p3].w)%mod;
}
void build(int p,int l,int r){
	tr[p].l=l,tr[p].r=r,tr[p].tmul=1;
	if(l==r){
		tr[p].w=a[l]%mod;
		return;
	}
	int mid=l+r>>1;
	build(p2,l,mid);
	build(p3,mid+1,r);
	pushup(p);
}
void pushdown(int p){
	tr[p2].w=(tr[p].tmul*tr[p2].w+tr[p].tadd*(tr[p2].r-tr[p2].l+1))%mod;
	tr[p3].w=(tr[p].tmul*tr[p3].w+tr[p].tadd*(tr[p3].r-tr[p3].l+1))%mod;
	tr[p2].tmul=(tr[p2].tmul*tr[p].tmul)%mod;
	tr[p3].tmul=(tr[p3].tmul*tr[p].tmul)%mod;
	tr[p2].tadd=(tr[p2].w*tr[p].tmul+tr[p].tadd)%mod;
	tr[p3].tadd=(tr[p3].w*tr[p].tmul+tr[p].tadd)%mod;
	tr[p].tadd=0,tr[p].tmul=1;
}
void updm(int p,int x,int y,int k){
	if(tr[p].l>=x&&tr[p].r<=y){
		tr[p].tadd=(tr[p].tadd*k)%mod;
		tr[p].tmul=(tr[p].tmul*k)%mod;
		tr[p].w=(tr[p].w*k)%mod;
		return;
	}
	pushdown(p);
	pushup(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid) updm(p2,x,y,k);
	if(y>mid) updm(p3,x,y,k);
	pushup(p);
}
void upda(int p,int x,int y,int k){
	if(tr[p].l>=x&&tr[p].r<=y){
		tr[p].tadd=(tr[p].tadd+k)%mod;
		tr[p].w=(tr[p].w+(tr[p].r-tr[p].l+1)*k)%mod;
		return;
	}
	pushdown(p);
	pushup(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid) upda(p2,x,y,k);
	if(y>mid) upda(p3,x,y,k);
	pushup(p);
}
int query(int p,int x,int y){
	if(tr[p].l>=x&&tr[p].r<=y){
		return tr[p].w;
	}
	pushdown(p);
	int ret=0,mid=tr[p].l+tr[p].r>>1;
	if(x<=mid) ret=query(p2,x,y)%mod;
	if(y>mid) ret+=query(p3,x,y)%mod;
	return ret%mod;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--){
		int opt;
		cin>>opt;
		if(opt==1){
			int x,y,k;
			cin>>x>>y>>k;
			updm(1,x,y,k);
		}
		else if(opt==2){
			int x,y,k;
			cin>>x>>y>>k;
			upda(1,x,y,k);
		}
		else {
			int x,y;
			cin>>x>>y;
			cout<<query(1,x,y)<<'\n';
		}
	}
	return 0;
}
2023/8/25 12:57
加载中...