全开long long试试
by Froggy @ 2019-01-11 12:45:38
@[肥婆纳妾](/space/show?uid=119067)
by Froggy @ 2019-01-11 12:45:43
@[Froggy](/space/show?uid=100285) 谢谢你的建议,但我也只有 l, r 下标 没开longlong 其它全是 longlong ,应该不是这儿的问题,难受ing
by 肥婆纳妾 @ 2019-01-11 16:53:22
@[肥婆纳妾](/space/show?uid=119067)
更新时没更新根结点
(我也犯过同样的错误)
by Froggy @ 2019-01-12 19:20:07
```cpp
#include<iostream>
using namespace std;
#define N 1000010
int n,m;
long long p,a[N];
struct node{
int l,r;
long long num,add,mul;
}tree[4*N];
void build(int i,int l,int r){
tree[i].l=l;
tree[i].r=r;
tree[i].mul=1;
tree[i].add=0;
if(l==r){
tree[i].num=a[l];
return ;
}
int mid=(tree[i].l+tree[i].r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tree[i].num=(tree[i*2].num+tree[i*2+1].num)%p;
}
void spread(int i){
if(tree[i].add||tree[i].mul!=1){
tree[i*2].num=(tree[i*2].num*tree[i].mul+tree[i].add*(tree[i*2].r-tree[i*2].l+1))%p;
tree[i*2+1].num=(tree[i*2+1].num*tree[i].mul+tree[i].add*(tree[i*2+1].r-tree[i*2+1].l+1))%p;
tree[i*2].mul=(tree[i*2].mul*tree[i].mul)%p;
tree[i*2+1].mul=(tree[i*2+1].mul*tree[i].mul)%p;
tree[i*2].add=(tree[i*2].add*tree[i].mul+tree[i].add)%p;
tree[i*2+1].add=(tree[i*2+1].add*tree[i].mul+tree[i].add)%p;
tree[i].add=0;
tree[i].mul=1;
}
}
void _plus(int i,int l,int r,int d){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].num+=(long long)d*(tree[i].r-tree[i].l+1);
tree[i].add+=d;
return;
}
spread(i);
int mid=(tree[i].l+tree[i].r)/2;
if(l<=mid){
_plus(i*2,l,r,d);
}
if(r>mid){
_plus(i*2+1,l,r,d);
}
tree[i].num=tree[i*2].num+tree[i*2+1].num;//here
}
void _pow(int i,int l,int r,int d){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].num=(tree[i].num*d)%p;
tree[i].mul=(tree[i].mul*d)%p;
tree[i].add=(tree[i].add*d)%p;
return;
}
spread(i);
int mid=(tree[i].l+tree[i].r)/2;
if(l<=mid){
_pow(i*2,l,r,d);
}
if(r>mid){
_pow(i*2+1,l,r,d);
}
tree[i].num=(tree[i*2].num+tree[i*2+1].num)%p;//here
}
long long ask(int i,int l,int r){
if(tree[i].l>=l&&tree[i].r<=r){
return tree[i].num;
}
spread(i);
int mid=(tree[i].l+tree[i].r)/2;
long long val=0;
if(l<=mid){
val+=ask(i*2,l,r);
}
if(r>mid){
val+=ask(i*2+1,l,r);
}
return val;
}
int main(){
cin>>n>>m>>p;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
int x,l,r,k;
cin>>x>>l>>r;
if(x==1){
cin>>k;
_pow(1,l,r,k);
}
else if(x==2){
cin>>k;
_plus(1,l,r,k);
}
else{
cout<<ask(1,l,r)%p<<endl;
}
}
return 0;
}
```
by Froggy @ 2019-01-12 19:39:17
@[Froggy](/space/show?uid=100285) 谢了,现在已经 把问题解决了
by 肥婆纳妾 @ 2019-01-13 01:07:54