社区讨论
help爆了
P3373【模板】线段树 2参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mls68z9l
- 此快照首次捕获于
- 2026/02/18 23:13 13 小时前
- 此快照最后确认于
- 2026/02/19 12:16 2 分钟前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,q,m,a[N],op,x,y,k;
struct node{
long long lt,rt,sum,tap;
}tr[4*N];
void build(int p,int l,int r)
{
tr[p]={l,r,a[l],0};
if(l==r)
return ;
int mid=l+r>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
}
void pushdown1(int p)
{
tr[p*2].sum+=(tr[p*2].rt-tr[p*2].lt+1)*tr[p].tap;
tr[p*2+1].sum+=(tr[p*2+1].rt-tr[p*2+1].lt+1)*tr[p].tap;
tr[p*2].tap+=tr[p].tap;
tr[p*2+1].tap+=tr[p].tap;
tr[p].tap=0;
}
void pushdown2(int p)
{
tr[p*2].sum*=(tr[p*2].rt-tr[p*2].lt+1)*tr[p].tap;
tr[p*2+1].sum*=(tr[p*2+1].rt-tr[p*2+1].lt+1)*tr[p].tap;
tr[p*2].tap*=tr[p].tap;
tr[p*2+1].tap*=tr[p].tap;
tr[p].tap=0;
}
void add(int p,int x,int y,int k)
{
if(x<=tr[p].lt&&tr[p].rt<=y)
{
tr[p].sum+=(tr[p].rt-tr[p].lt+1)*k;
tr[p].tap+=k;
}
pushdown1(p);
int mid=x+y>>1;
if(x<=mid)
add(p,x,mid,k);
if(mid<y)
add(p,mid+1,y,k);
tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
}
void times(int p,int x,int y,int k)
{
if(x<=tr[p].lt&&tr[p].rt<=y)
{
tr[p].sum*=(tr[p].rt-tr[p].lt+1)*k;
tr[p].tap*=k;
}
pushdown2(p);
int mid=x+y>>1;
if(x<=mid)
add(p,x,mid,k);
if(mid<y)
add(p,mid+1,y,k);
tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
}
int query(int p,int x,int y)
{
if(x<=tr[p].lt&&tr[p].rt<=y)
return tr[p].sum;
pushdown1(p);
int mid=x+y>>1;
int sum=0;
if(x<=mid)
sum+=query(p*2,x,y);
if(mid<y)
sum+=query(p*2+1,x,y);
return sum;
}
signed main()
{
cin>>n>>q>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(q--)
{
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
times(1,x,y,k);
}
if(op==2)
{
cin>>x>>y>>k;
add(1,x,y,k);
}
if(op==3)
{
cin>>x>>y;
cout<<query(1,x,y)%m<<endl;
}
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...