逆如天,声明别名要每个分别声明
#include <bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
const int N=1e5+10;
struct Node
{
int l,r;
int v;
int add,mul;
}tr[4*N];
int p;
int w[N];
void pushup(int u)
{
tr[u].v=(tr[u<<1].v+tr[u<<1|1].v)%p;
}
void build(int u,int l,int r)
{
tr[u].l=l,tr[u].r=r,tr[u].mul=1;
if(l==r)tr[u].v=w[r];
else
{
int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
}
void pushdown(int u)
{
auto &root=tr[u],&left=tr[u<<1],&right=tr[u<<1|1];//逆如天,声明别名要每个分别声明
//cout<<"pushdown"<<root.mul<<" "<<root.add<<endl;
left.mul=(left.mul*root.mul)%p,left.v=(left.v*root.mul)%p;
right.mul=(right.mul*root.mul)%p,right.v=(right.v*root.mul)%p;
left.add=(left.add*root.mul+root.add)%p,left.v=(left.v+(left.r-left.l+1)*root.add)%p;
right.add=(right.add*root.mul+root.add)%p,right.v=(right.v+(right.r-right.l+1)*root.add)%p;
//cout<<left.v<<tr[10].v<<endl;
root.mul=1,root.add=0;
}
void modify(int u,int l,int r,int c,int d)
{
if(tr[u].l>=l&&tr[u].r<=r)
{
tr[u].v=tr[u].v*d%p;
tr[u].add=(tr[u].add*d)%p;
tr[u].mul=(tr[u].mul*d)%p;
tr[u].v=(tr[u].v+(tr[u].r-tr[u].l+1)*c)%p;
tr[u].add=(tr[u].add+c)%p;
}
else
{
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid)modify(u<<1,l,r,c,d);
if(r>mid)modify(u<<1|1,l,r,c,d);
pushup(u);
}
}
int query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r)return tr[u].v;
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
int sum=0;
//cout<<tr[u].l<<" "<<mid<<" "<<tr[u].r<<endl;
if(l<=mid)sum=(sum+query(u<<1,l,r))%p;
if(r>mid)sum=(sum+query(u<<1|1,l,r))%p;
return sum;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n>>p;
for(int i=1;i<=n;i++)
{
cin>>w[i];
w[i]=w[i]%p;
}
build(1,1,n);
int m;
cin>>m;
//cout<<tr[3].v<<endl;
for(int i=1;i<=m;i++)
{
int op;
cin>>op;
if(op==1)
{
int l,r,c;
cin>>l>>r>>c;
modify(1,l,r,0,c);
}
if(op==2)
{
int l,r,c;
cin>>l>>r>>c;
modify(1,l,r,c,1);
}
if(op==3)
{
int l,r;
cin>>l>>r;
cout<<query(1,l,r)<<endl;
}
//cout<<tr[10].v<<endl;
}
return 0;
}
哇趣,我之前也遇到过,还有指针也是