比赛 2024暑假C班集训E 评测结果 AAWWWWTTTTTTWWWWTTTT
题目名称 相逢是问候 最终得分 10
用户昵称 dream 运行时间 30.742 s
代码语言 C++ 内存使用 5.89 MiB
提交时间 2024-07-14 11:53:04
显示代码纯文本
#include<bits/stdc++.h>
#define ls p*2
#define rs p*2+1 
#define int long long
using namespace std;
typedef long long ll;
const int N=50005;
int n,m,mod,c;
int bitpow(int a,int x,int p){
	int res=1;
	while(x){
		if(x&1){
			res*=a;
			res%=mod;
		}
		a*=a;
		a%=mod;
		x>>=1;	
	}
	return res;
}
struct node{
	int l,r;
	ll sum,add;
}tr[N*4];
int a[N];
void pushup(int p){
	tr[p].sum=tr[ls].sum+tr[rs].sum;
	tr[p].sum%=mod;
}
void build(int p,int l,int r){
	tr[p].l=l,tr[p].r=r;
	if(l==r){
		tr[p].sum=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
} 
void pushdown(int p){
	if(tr[p].add){
		tr[ls].add+=tr[p].add;
		tr[ls].add%=mod;
		tr[rs].add+=tr[p].add;
		tr[rs].add%=mod;
		tr[ls].sum+=tr[p].add*(tr[ls].r-tr[ls].l+1);
		tr[ls].sum%=mod;
		tr[rs].sum+=tr[p].add*(tr[rs].r-tr[rs].l+1);
		tr[rs].sum%=mod;
		tr[p].add;
	}
}
void update(int p,int l,int r,int v){
	if(l<=tr[p].l&&tr[p].r<=r){
		tr[p].sum+=v*(tr[p].r-tr[p].l+1);
		tr[p].sum%=mod;
		tr[p].add+=v;
		tr[p].add%=mod;
		return ;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)/2;
	if(l<=mid){
		update(ls,l,r,v);
	}
	if(r>mid){
		update(rs,l,r,v);
	} 
	pushup(p);
}
ll query(int p,int l,int r){
	if(l<=tr[p].l&&tr[p].r<=r){
		return tr[p].sum;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)/2;
	ll res=0;
	if(l<=mid){
		res+=query(ls,l,r);
		res%=mod;
	} 
	if(r>mid){
		res+=query(rs,l,r);
		res%=mod;
	}
	return res;
}
signed main(){
	ios::sync_with_stdio(0);
	freopen("verbinden.in","r",stdin);
	freopen("verbinden.out","w",stdout);
	cin>>n>>m>>mod>>c;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int c,x,y;
		cin>>c>>x>>y;
		if(c==0){
			for(int i=x;i<=y;i++){
				int aa=query(1,i,i);
				update(1,i,i,-aa);
				update(1,i,i,bitpow(c,aa,mod));
			}
		}
		else{
			cout<<query(1,x,y)<<"\n";
		}
	}
	return 0;
}