样例是过了,但0pts,自己瞎编数据也不对
比如输入:
4 3 100
1 2 3 4
1 1 3 2
2 2 3 2
3 1 4
会莫名其妙出来17(
#include<bits/stdc++.h>
#define maxn 100010
#define ll long long
using namespace std;
ll n,m,p;
ll a[maxn];
ll ans[maxn*4],tag_add[maxn*4],tag_mul[maxn*4];
ll ls(ll x)
{
return x*2;
}
ll rs(ll x)
{
return x*2+1;
}
void push_up(ll x)
{
ans[x]=ans[ls(x)]+ans[rs(x)];
return;
}
void build(ll l,ll r,ll x)
{
tag_mul[x]=1,tag_add[x]=0;
if(l==r)
{
ans[x]=a[l];
return;
}
ll mid=(l+r)/2;
build(l,mid,ls(x));
build(mid+1,r,rs(x));
push_up(x);
return;
}
void add(ll l,ll r,ll x,ll num)
{
ans[x]+=num*(r-l+1);
tag_add[x]+=num;
return;
}
void push_down_add(ll l,ll r,ll x)
{
ll mid=(l+r)/2;
add(l,mid,ls(x),tag_add[x]);
add(mid+1,r,rs(x),tag_add[x]);
tag_add[x]=0;
return;
}
void update_add(ll l,ll r,ll x,ll lx,ll rx,ll num)
{
if(l>=lx&&r<=rx)
{
add(l,r,x,num);
return;
}
push_down_add(l,r,x);
ll mid=(l+r)/2;
if(mid>=lx)update_add(l,mid,ls(x),lx,rx,num);
if(mid<rx)update_add(mid+1,r,rs(x),lx,rx,num);
push_up(x);
return;
}
void mul(ll l,ll r,ll x,ll num)
{
ans[x]*=num;
tag_mul[x]*=num;
return;
}
void push_down_mul(ll l,ll r,ll x)
{
ll mid=(l+r)/2;
mul(l,mid,ls(x),tag_mul[x]);
mul(mid+1,r,rs(x),tag_mul[x]);
tag_mul[x]=1;
return;
}
void update_mul(ll l,ll r,ll x,ll lx,ll rx,ll num)
{
if(l>=lx&r<=rx)
{
mul(l,r,x,num);
return;
}
push_down_mul(l,r,x);
ll mid=(l+r)/2;
if(mid>=lx)update_mul(l,mid,ls(x),lx,rx,num);
if(mid<rx)update_mul(mid+1,r,rs(x),lx,rx,num);
push_up(x);
return;
}
ll answer(ll l,ll r,ll x,ll lx,ll rx)
{
if(l>=lx&&r<=rx)
{
return ans[x];
}
ll mid=(l+r)/2,tot=0;
push_down_mul(l,r,x);
push_down_add(l,r,x);
if(mid>=lx)tot+=answer(l,mid,ls(x),lx,rx);
if(mid<rx)tot+=answer(mid+1,r,rs(x),lx,rx);
return tot;
}
int main()
{
cin>>n>>m>>p;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
for(int i=0;i<m;i++)
{
int opt=0;
cin>>opt;
if(opt==1)
{
int x,y,k;
cin>>x>>y>>k;
update_mul(1,n,1,x,y,k);
}
else if(opt==2)
{
int x,y,k;
cin>>x>>y>>k;
update_add(1,n,1,x,y,k);
}
else
{
int x,y;
cin>>x>>y;
cout<<answer(1,n,1,x,y)%p<<endl;
}
}
return 0;
}