样例能过,#1#3#4能过,剩余全 WA。
代码如下:
#include<iostream>
using namespace std;
#define ls(p) p<<1
#define rs(p) p<<1|1
#define ll long long
const int N=1e5+5;
struct Node
{
int l,r;
ll val,add,mul;
};
Node st[N<<2];
ll a[N];
int n,q;
ll m;
void pushup(int p)
{
st[p].val=(st[ls(p)].val+st[rs(p)].val)%m;
}
void build(int p,int l,int r)
{
st[p].l=l;
st[p].r=r;
st[p].add=0;
st[p].mul=1;
if (l==r)
{
st[p].val=a[l]%m;
return;
}
int mid=l+r>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
void pushdown(int p)
{
((st[ls(p)].val*=st[p].mul)%=m)+=st[p].add*(st[ls(p)].r-st[ls(p)].l+1)%m;
((st[rs(p)].val*=st[p].mul)%=m)+=st[p].add*(st[rs(p)].r-st[rs(p)].l+1)%m;
(st[ls(p)].mul*=st[p].mul)%=m;
(st[rs(p)].mul*=st[p].mul)%=m;
(((st[ls(p)].add*=st[p].mul)%=m)+=st[p].add)%=m;
(((st[rs(p)].add*=st[p].mul)%=m)+=st[p].add)%=m;
st[p].mul=1;
st[p].add=0;
}
void update1(int p,int l,int r,ll v)
{
if (l<=st[p].l&&st[p].r<=r)
{
(st[p].val*=v)%=m;
(st[p].mul*=v)%=m;
(st[p].add*=v)%=m;
return;
}
int mid=st[p].l+st[p].r>>1;
pushdown(p);
if (l<=mid)
update1(ls(p),l,mid,v);
if (mid<r)
update1(rs(p),mid+1,r,v);
pushup(p);
}
void update2(int p,int l,int r,ll v)
{
if (l<=st[p].l&&st[p].r<=r)
{
(st[p].val+=v*(st[p].r-st[p].l+1)%m)%=m;
(st[p].add+=v)%=m;
return;
}
int mid=st[p].l+st[p].r>>1;
pushdown(p);
if (l<=mid)
update2(ls(p),l,r,v);
if (mid<r)
update2(rs(p),l,r,v);
pushup(p);
}
ll query(int p,int l,int r)
{
int mid=st[p].l+st[p].r>>1;
if (l<=st[p].l&&st[p].r<=r)
return st[p].val%m;
pushdown(p);
ll ret=0;
if (l<=mid)
(ret+=query(ls(p),l,r))%=m;
if (mid<r)
(ret+=query(rs(p),l,r))%=m;
return ret;
}
int main()
{
//freopen("P3373_2.in","r",stdin);
//freopen("result.out","w",stdout);
cin>>n>>q>>m;
for (int i=1;i<=n;i++)
{
cin>>a[i];
a[i]%=m;
}
build(1,1,n);
while (q--)
{
int op;
cin>>op;
if (op==1)
{
int x,y,k;
cin>>x>>y>>k;
update1(1,x,y,k%m);
}
else if (op==2)
{
int x,y,k;
cin>>x>>y>>k;
update2(1,x,y,k%m);
}
else
{
int x,y;
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}
下载了#2,有1e5个数字和1e5个操作,模数571373。前几个操作依次为:加法、求和、乘法、加法、乘法、加法、求和……第一行输出是对的,第二行答案是187938,以上代码会输出277015,后面全错。
取模和数据类型都没查出问题,求高手指点到底错哪了。