有码风长得一样的吗
第二个点数据挺大的,自己真的难调。板子题做的人应该挺多,所以方便的话帮忙看看呗~
#include<bits/stdc++.h>
#define int long long
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
using namespace std;
const int maxn=100050;
int n,m,p,tree[maxn<<2],addtag[maxn<<2],multag[maxn<<2];
void push_up(int rt) {
tree[rt]=(tree[rt<<1]+tree[rt<<1|1])%p;
}
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
void push_down(int l,int r,int rt)
{
if(l<r&&(addtag[rt]||multag[rt]!=1))
{
int mid=(l+r)>>1;
tree[rt<<1]=(tree[rt<<1]*multag[rt]+(mid-l+1)*addtag[rt])%p;
tree[rt<<1|1]=(tree[rt<<1|1]*multag[rt]+(r-mid)*addtag[rt])%p;
multag[rt<<1]=multag[rt<<1]*multag[rt]%p;
multag[rt<<1|1]=multag[r<<1|1]*multag[rt]%p;
addtag[rt<<1]=(addtag[rt<<1]*multag[rt]+addtag[rt])%p;
addtag[rt<<1|1]=(addtag[rt<<1|1]*multag[rt]+addtag[rt])%p;
}
addtag[rt]=0,multag[rt]=1;
}
void build(int l,int r,int rt)
{
addtag[rt]=0,multag[rt]=1;
if(l==r) cin>>tree[rt],tree[rt]%=p;
else
{
int mid=(l+r)>>1;
build(lson);
build(rson);
push_up(rt);
}
}
void update_mul(int L,int R,int x,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
tree[rt]=tree[rt]*x%p;
multag[rt]=multag[rt]*x%p;
addtag[rt]=addtag[rt]*x%p;
}
else
{
push_down(l,r,rt);
int mid=(l+r)>>1;
if(L<=mid) update_mul(L,R,x,lson);
if(R>mid) update_mul(L,R,x,rson);
push_up(rt);
}
}
void update_add(int L,int R,int x,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
tree[rt]=(tree[rt]+(r-l+1)*x)%p;
addtag[rt]=(addtag[rt]+x)%p;
}
else
{
push_down(l,r,rt);
int mid=(l+r)>>1;
if(L<=mid) update_add(L,R,x,lson);
if(R>mid) update_add(L,R,x,rson);
push_up(rt);
}
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return tree[rt];
int mid=(l+r)>>1,res=0;
push_down(l,r,rt);
if(L<=mid) res=(res+query(L,R,lson))%p;
if(R>mid) res=(res+query(L,R,rson))%p;
return res;
}
signed main()
{
cin>>n>>m>>p;
build(1,n,1);
while(m--)
{
int op,L,R,x;
cin>>op>>L>>R;
if(op==1)
{
cin>>x;
update_mul(L,R,x,1,n,1);
}
else if(op==2)
{
cin>>x;
update_add(L,R,x,1,n,1);
}
else cout<<query(L,R,1,n,1)<<endl;
}
return 0;
}