#include <bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read()
{
ll x=0,f=1;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}//快读
const int NUM=1e5+5;
ll tree[NUM<<2],a[NUM<<2];
ll n,q,m,step_tree;
ll lazy_sum[NUM<<2],lazy_mu[NUM<<2];
inline ll left_son(ll x)
{
return x<<1;
}//求左儿子
inline ll right_son(ll x)
{
return (x<<1)|1;
}//求右儿子
inline ll sum_up(ll x)
{
return tree[x]=tree[left_son(x)]+tree[right_son(x)];
}//求和
inline void build_tree(ll l,ll r,ll x)
{
lazy_mu[x]=1;
lazy_sum[x]=0;
if(l == r)
{
tree[x] = a[l]%m;
return;
}
ll mid=(l+r)>>1;
build_tree(l,mid,left_son(x));
build_tree(mid+1,r,right_son(x));
sum_up(x);
}//构建线段树
inline void maketag(ll now_site,ll l,ll r,ll ad,ll mu)
{
tree[now_site] = tree[now_site]*mu%m;
tree[now_site] = (tree[now_site]+(r-l+1)*ad)%m;
lazy_mu[now_site] = (lazy_mu[now_site]+mu)%m;
lazy_sum[now_site] = lazy_sum[now_site]*mu%m;
lazy_sum[now_site] = (lazy_sum[now_site]+ad)%m;
return;
}
inline void pushdown(ll now_site,ll l,ll r)
{
ll mid=(l+r)>>1;
maketag(left_son(now_site),l,mid,lazy_sum[now_site],lazy_mu[now_site]);
maketag(right_son(now_site),mid+1,r,lazy_sum[now_site],lazy_mu[now_site]);
lazy_mu[now_site] = 1;
lazy_sum[now_site] = 0;
return;
}
inline void update(ll need_l,ll need_r,ll l,ll r,ll now_site,ll ad,ll mu)
{
if(need_l <= l && need_r >= r)
{
tree[now_site]=(tree[now_site]*mu)%m;
tree[now_site] = (tree[now_site]+ad*(r-l+1))%m;
lazy_mu[now_site] = (lazy_mu[now_site]+mu)%m;
lazy_sum[now_site] = lazy_sum[now_site]*mu%m;
lazy_sum[now_site] = (lazy_sum[now_site]+ad)%m;
return;
}
pushdown(now_site,l,r);
ll mid=(l+r)>>1;
if(need_l <= mid)
update(left_son(now_site),need_l,need_r,l,mid,ad,mu);
if(mid < need_r)
update(right_son(now_site),need_l,need_r,mid+1,r,ad,mu);
sum_up(now_site);
}
inline ll get_ans(ll l,ll r,ll need_l,ll need_r,ll now_site)
{
if(need_l <= l && need_r >= r)
return tree[now_site];
ll mid=(l+r)>>1;
pushdown(now_site,l,r);
ll num=0;
if(need_l <= mid)
num+=get_ans(l,mid,need_l,need_r,left_son(now_site))%m;
if(need_r > mid)
num+=get_ans(mid+1,r,need_l,need_r,right_son(now_site))%m;
return num%m;
}
int main()
{
n = read();
q = read();
m = read();
for(int i=1;i <= n;++i)
a[i] = read();
build_tree(1,n,1);
while(q--)
{
step_tree = read();
if(step_tree == 1)
{
int x,y,z;
x = read();
y = read();
z = read();
update(x,y,1,n,1,0,z);
}
else{
if(step_tree == 2)
{
int x,y,z;
x = read();
y = read();
z = read();
update(x,y,1,n,1,z,1);
}
else{
int x,y;
x = read();
y = read();
printf("%lld\n",get_ans(1,n,x,y,1));
}
}
}
return 0;
}
蒻蒟蒟一枚,样例都没过,但是不知道哪里错了