调long long,取模等问题都检查了一遍仍然不行,求调
#include<iostream>
using namespace std;
int m,n,q;
long long a[100004];
struct SegTreeNode
{
int lran,rran;
long long val,tag_add,tag_mult;
SegTreeNode *left,*right;
SegTreeNode()=default;
SegTreeNode(int l,int r):lran(l),rran(r),tag_add(0),tag_mult(1),left(nullptr),right(nullptr)
{
val=0;
for(int i=lran;i<=rran;i++) val=(val+a[i])%m;
}
~SegTreeNode()
{
if(left) {delete left; left=nullptr;}
if(right) {delete right; right=nullptr;}
}
void check()
{
if(!left && lran!=rran) left=new SegTreeNode(lran,(lran+rran)/2);
if(!right && lran!=rran) right=new SegTreeNode((lran+rran)/2+1,rran);
}
void pushdown()
{
if(tag_add==0 && tag_mult==1) return;
if(lran==rran)
{
tag_add=0;tag_mult=1;return;
}
check();
left->tag_mult = (left->tag_mult * tag_mult)%m;
right->tag_mult = (right->tag_mult * tag_mult)%m;
left->tag_add = (left->tag_add * tag_mult %m + tag_add%m) %m;
right->tag_add = (right->tag_add * tag_mult %m + tag_add%m) %m;
left->val = (left->val * tag_mult %m + tag_add * (left->rran - left->lran + 1) %m) %m;
right->val = (right->val * tag_mult %m + tag_add * (right->rran - right->lran +1) %m) %m;
tag_add=0;tag_mult=1;
}
};
struct SegTree
{
SegTreeNode *root;
SegTree()=default;
SegTree(int l,int r)
{
root=new SegTreeNode(l,r);
}
~SegTree()
{
delete root;
root=nullptr;
}
void add(SegTreeNode *node,int x,int y,int k)
{
if(x==node->lran && y==node->rran)
{
node->tag_add+=k;
node->val+=k*(node->rran - node->lran +1);
return;
}//lran=rran already returns here
int mid = (node->lran + node->rran)/2;
node->check();
node->pushdown();
if(y<=mid)
{
add(node->left,x,y,k);
}
else if(x>=mid+1)
{
add(node->right,x,y,k);
}
else
{
add(node->left,x,mid,k);
add(node->right,mid+1,y,k);
}
node->val = (node->left->val + node->right->val) %m;
}
void mult(SegTreeNode *node,int x,int y,int k)
{
if(x==node->lran && y==node->rran)
{
node->tag_mult*=k;
node->val*=k;
node->tag_add*=k;
return;
}//lran=rran already returns here
int mid = (node->lran + node->rran)/2;
node->check();
node->pushdown();
if(y<=mid)
{
mult(node->left,x,y,k);
}
else if(x>=mid+1)
{
mult(node->right,x,y,k);
}
else
{
mult(node->left,x,mid,k);
mult(node->right,mid+1,y,k);
}
node->val = (node->left->val + node->right->val) %m;
}
long long sum(SegTreeNode *node,int x,int y)
{
if(x==node->lran && y==node->rran) return node->val %m;//lran==rran already returns here
int mid=(node->lran + node->rran)/2;
node->check();
node->pushdown();
if(y<=mid)
{
return sum(node->left,x,y) %m;
}
else if(x>=mid+1)
{
return sum(node->right,x,y) %m;
}
else
{
return (sum(node->left,x,mid) + sum(node->right,mid+1,y))%m;
}
}
};
int main()
{
cin>>n>>q>>m;
for(int i=1;i<=n;i++) cin>>a[i];
SegTree Tree(1,n);
for(int i=1;i<=q;i++)
{
int op,x,y,k;
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
Tree.mult(Tree.root,x,y,k);
}
if(op==2)
{
cin>>x>>y>>k;
Tree.add(Tree.root,x,y,k);
}
if(op==3)
{
cin>>x>>y;
cout<<Tree.sum(Tree.root,x,y)<<endl;
}
}
return 0;
}