样例能过,测试点一不%求余也能过(好像不%求余至少答案是对的),但是一加上取余就错了。。。当然有可能会超时(这是后话)。。。感觉我对乘法和加法的取余理解没错啊怎么会完全%不到一块儿呢????
#include<bits/stdc++.h>
using namespace std;
struct node
{
int num,zhi;
};
int p;
vector<node> biao[200000];
long long a[200000]={0};
long long build(int l,int r,int k)
{
if(l==r) return a[k];
a[k*2]=build(l,(l+r)/2,k*2);
a[k*2+1]=build((l+r)/2+1,r,k*2+1);
// a[k]=((a[k*2]%p)+(a[k*2+1]%p))%p;
a[k]=a[k*2]+a[k*2+1];
// return a[k]%p;
return a[k];
}
long long quy(int x,int y,int l,int r,int k)
{
// cout<<l<<" "<<r<<endl;
if(l>=x && r<=y)
{
// cout<<"a[k]="<<a[k]<<endl;
// return a[k]%p;
return a[k];
}
else if(l>y || r<x) return 0;
else
{
if(biao[k].size())
{
int t=biao[k].size();
for(int i=0;i<t;i++)
{
biao[2*k].push_back(biao[k][i]);
biao[2*k+1].push_back(biao[k][i]);
if(biao[k][i].num==1)
{
// a[k*2]=((a[k*2]%p)*(biao[k][i].zhi%p))%p;
// a[k*2+1]=((a[k*2+1]%p)*(biao[k][i].zhi%p))%p;
a[k*2]=(a[k*2]*biao[k][i].zhi);
a[k*2+1]=a[k*2+1]*biao[k][i].zhi;
}
else
{
int xx=(r+l)/2-l+1;
int xxx=(r-l+1)-xx;
// a[k*2+1]+=((biao[k][i].zhi*xxx)%p);
// a[k*2+1]%=p;
// a[k*2+1]=(a[k*2+1]%p+(biao[k][i].zhi%p*xxx%p)%p)%p;
a[k*2+1]+=(biao[k][i].zhi*xxx);
a[k*2]+=(biao[k][i].zhi*xx);
// a[k*2]+=((biao[k][i].zhi*xx)%p);
// a[k*2]%=p;
// a[k*2]=(a[k*2]%p+(biao[k][i].zhi%p*xx%p)%p)%p;
}
}
biao[k].clear();
}
// long long sum=0;
long long k1=quy(x,y,l,(l+r)/2,k*2);
long long k2=quy(x,y,(l+r)/2+1,r,k*2+1);
return k1+k2;
}
}
long long up(int x,int y,int kk,int l,int r,int k,int num)
{
// cout<<l<<" "<<r<<" "<<kk<<endl;
// cout<<"x="<<x<<" "<<"y="<<y<<endl;
if(l>=x && r<=y)
{
node t={num,kk};biao[k].push_back(t);
if(num==2)
{
long long x=(r-l+1)*kk;
a[k]+=x;
// a[k]%=p;
// a[k]=(a[k]%p+(x%p))%p;
// cout<<"x="<<x<<endl;
// return (x%p);
return x;
}
else
{
long long x=a[k]*(kk-1);
// a[k]=(a[k]%p+(x%p))%p;
a[k]+=x;
// cout<<"x="<<x<<endl;
// return (x%p);
return x;
}
}
else if(l>y || r<x ) return 0;
else
{
long long k1=up(x,y,kk,l,(l+r)/2,k*2,num);
long long k2=up(x,y,kk,(l+r)/2+1,r,k*2+1,num);
a[k]+=k1+k2;
// a[k]%=p;
// a[k]=(a[k]%p+((k1%p)+(k2%p))%p)%p;
cout<<"k1+k2="<<k1+k2<<endl;
// return ((k1%p)+(k2%p))%p;
return k1+k2;
}
}
int main()
{
freopen("in.txt","r",stdin);
// fill(biao1,biao1+200000,1);
int n,m;
// int p;
cin>>n>>m>>p;
// cout<<n<<" "<<m<<" "<<p<<endl;
int nn=1;
while(nn<n)
nn*=2;
for(int i=1;i<=n;i++)
cin>>a[i+nn-1];
build(1,nn,1);
// for(int i=1;i<=nn;i++) cout<<a[i]<<" ";
// cout<<endl;
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
if(x==1)
{
int s,ss,sss;
cin>>s>>ss>>sss;
long long u=up(s,ss,sss,1,nn,1,1);
}
else if(x==2)
{
int s,ss,sss;
cin>>s>>ss>>sss;
long long u=up(s,ss,sss,1,nn,1,2);
}
else
{
int l,r;
cin>>l>>r;
cout<<quy(l,r,1,nn,1)%p<<endl;
}
}
// for(int i=1;i<=nn;i++) cout<<a[i]<<endl;
}