按自己的想法写的线段树...练想带调做了一晚上了,不知道WA哪里了,神犇帮我康康吧
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 105;
#define ls(u) p[u].ch[0]
#define rs(u) p[u].ch[1]
int n,m,mod;
int num[N];
struct Node
{
int l,r,len,ch[2];
ll ans=0,tag1=0,tag2=1;
}p[4*N];
void push_up(int u)
{
p[u].ans=(p[ls(u)].ans+p[rs(u)].ans)%mod;
}
void push_down(int u)
{
p[ls(u)].tag2=(p[ls(u)].tag2*p[u].tag2)%mod;
p[ls(u)].tag1=(p[ls(u)].tag1*p[u].tag2)%mod;
p[ls(u)].ans=(p[ls(u)].ans*p[u].tag2)%mod;
p[rs(u)].tag2=(p[rs(u)].tag2*p[u].tag2)%mod;
p[rs(u)].tag1=(p[rs(u)].tag1*p[u].tag2)%mod;
p[rs(u)].ans=(p[rs(u)].ans*p[u].tag2)%mod;
p[u].tag2=1;
p[ls(u)].tag1=(p[ls(u)].tag1+p[u].tag1)%mod;
p[rs(u)].tag1=(p[rs(u)].tag1+p[u].tag1)%mod;
p[ls(u)].ans=(p[ls(u)].ans+p[u].tag1)%mod;
p[rs(u)].ans=(p[rs(u)].ans+p[u].tag1)%mod;
p[u].tag1=0;
}
void update1(int u,int k)
{
p[u].tag1=(p[u].tag1+k)%mod;
p[u].ans=(p[u].ans+(p[u].len*k)%mod)%mod;
}
void update2(int u,int k)
{
p[u].tag2=(p[u].tag2*k)%mod;
p[u].ans=(p[u].ans*k)%mod;
}
void build_tree(int u,int l,int r)
{
int mid=(l+r)>>1;
ls(u)=u<<1;rs(u)=u<<1|1;
p[u].l=l;
p[u].r=r;
p[u].len=r-l+1;
if(l==r)
{
p[u].ans=num[l];
return ;
}
build_tree(ls(u),l,mid);
build_tree(rs(u),mid+1,r);
push_up(u);
}
void add(int u,int l,int r,int k)
{
push_down(u);
int mid=(p[u].l+p[u].r)>>1;
if(p[u].l==l&&p[u].r==r)
{
update1(u,k);
return ;
}
if(l>mid) add(rs(u),l,r,k);
else if(r<=mid) add(ls(u),l,r,k);
else
{
add(ls(u),l,mid,k);
add(rs(u),mid+1,r,k);
}
push_up(u);
}
void mul(int u,int l,int r,int k)
{
push_down(u);
int mid=(p[u].l+p[u].r)>>1;
if(p[u].l==l&&p[u].r==r)
{
update2(u,k);
return ;
}
if(l>mid) mul(rs(u),l,r,k);
else if(r<=mid) mul(ls(u),l,r,k);
else
{
mul(ls(u),l,mid,k);
mul(rs(u),mid+1,r,k);
}
push_up(u);
}
ll find_sum(int u,int l,int r)
{
int mid=(p[u].l+p[u].r)>>1;
push_down(u);
if(l==p[u].l&&r==p[u].r)
{
return p[u].ans;
}
if(l>mid) return find_sum(rs(u),mid+1,r)%mod;
else if(r<=mid) return find_sum(ls(u),l,mid)%mod;
else return (find_sum(ls(u),l,mid)+find_sum(rs(u),mid+1,r))%mod;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>mod;
for(int i=1;i<=n;++i)
{
cin>>num[i];
}
build_tree(1,1,n);
for(int i=1;i<=m;++i)
{
int mark,x,y,k;
cin>>mark>>x>>y;
if(mark==1) {cin>>k; mul(1,x,y,k);}
if(mark==2) {cin>>k; add(1,x,y,k);}
if(mark==3) {cout<<find_sum(1,x,y)<<"\n";}
}
return 0;
}