#include<cstdio>
using namespace std;
typedef long long ll;
struct node
{
ll l,r,lc,rc,c,mul,add;
node()
{
l=r=lc=rc=c=add=0;mul=1;
}
}tr[410000];ll len=0,a[110000],p;
void bt(ll l,ll r)
{
len++;ll now=len;
tr[now].l=l,tr[now].r=r,tr[now].lc=tr[now].rc=-1;
if(l==r)tr[now].c=a[l];
else
{
ll mid=(l+r)/2;
tr[now].lc=len+1;bt(l,mid);
tr[now].rc=len+1;bt(mid+1,r);
tr[now].c=(tr[tr[now].lc].c+tr[tr[now].rc].c)%p;
}
}
void pushdown(ll now,ll l,ll r)
{
ll lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
tr[lc].c=(tr[lc].c*tr[now].mul%p+tr[now].add*(mid-l+1)%p)%p;
tr[lc].mul=(tr[lc].mul*tr[now].mul)%p;
tr[lc].add=(tr[lc].add*tr[now].mul+tr[now].add)%p;
tr[rc].c=(tr[rc].c*tr[now].mul%p+tr[now].add*(r-mid-1+1)%p)%p;
tr[rc].mul=(tr[rc].mul*tr[now].mul)%p;
tr[rc].add=(tr[rc].add*tr[now].mul+tr[now].add)%p;
tr[now].add=0;tr[now].mul=1;
return;
}
void change_add(ll now,ll l,ll r,ll k)
{
if(tr[now].r<l||tr[now].l>r)return;
if(l<=tr[now].l&&tr[now].r<=r)
{
tr[now].c=(tr[now].c+k*(tr[now].r-tr[now].l+1)%p)%p;
tr[now].add=(tr[now].add+k)%p;return;
}
pushdown(now,tr[now].l,tr[now].r);
ll lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
change_add(lc,l,mid,k);change_add(rc,mid+1,r,k);
tr[now].c=(tr[lc].c+tr[rc].c)%p;
}
void change_mul(ll now,ll l,ll r,ll k)
{
if(tr[now].r<l||tr[now].l>r)return;
if(l<=tr[now].l&&tr[now].r<=r)
{
tr[now].c=(tr[now].c*k)%p;
tr[now].mul=(tr[now].mul*k)%p;
tr[now].add=(tr[now].add*k)%p;
return;
}
pushdown(now,tr[now].l,tr[now].r);
ll lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
change_mul(lc,l,mid,k);change_mul(rc,mid+1,r,k);
tr[now].c=(tr[lc].c+tr[rc].c)%p;
}
ll getsum(ll now,ll l,ll r)
{
if(tr[now].r<l||tr[now].l>r)return 0;
if(l<=tr[now].l&&tr[now].r<=r)return tr[now].c;
pushdown(now,tr[now].l,tr[now].r);
ll lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
return (getsum(lc,l,mid)+getsum(rc,mid+1,r))%p;
}
int main()
{
ll n,m;scanf("%lld%lld%lld",&n,&m,&p);
for(int i=1;i<=n*4;i++)tr[i].mul=1;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
len=0;bt(1,n);
for(int i=1;i<=m;i++)
{
ll l;scanf("%lld",&l);
if(l==1)
{
ll x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
change_mul(1,x,y,z);
}else if(l==2)
{
ll x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
change_add(1,x,y,z);
}else
{
ll x,y;scanf("%lld%lld",&x,&y);
printf("%lld\n",getsum(1,x,y)%p);
}
}
return 0;
}
样例对了,为什么交上去就是零分??求大神改正