社区讨论
样例没过求调教 悬关
P3373【模板】线段树 2参与者 2已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @lo1qs0ry
- 此快照首次捕获于
- 2023/10/23 01:27 2 年前
- 此快照最后确认于
- 2023/11/03 02:06 2 年前
CPP急急急我是急先锋
#include<bits/stdc++.h>
#define lc x<<1
#define rc (x<<1)|1
using namespace std;
int n,m,q,a[4000010];
struct node{
int sm,mul,ad;
}tr[400010];
void update(int x){
tr[x].sm=tr[lc].sm%q+tr[rc].sm%q;
}
void build(int x,int l,int r){
tr[x].mul=1;
if(l==r) {
tr[x].sm=a[l];
return;
}
int mid=l+r>>1;
build(lc,l,mid);build(rc,mid+1,r);
update(x);
}
void pushdown(int x,int l,int r){
if(tr[x].mul!=1){
tr[lc].ad*=tr[x].mul%q+tr[x].ad;tr[rc].ad*=tr[x].mul%q+tr[x].ad;
int mid=l+r >>1;
tr[lc].sm*=tr[x].mul%q;tr[rc].sm*=tr[x].mul%q;
tr[lc].mul*=tr[x].mul%q;tr[rc].mul*=tr[x].mul%q;
tr[lc].sm+=(mid-l+1)*tr[x].ad%q;tr[rc].sm+=(r-mid)*tr[x].ad%q;
tr[x].mul=1;tr[x].ad=0;
}
if(tr[x].ad){
int mid=l+r >>1;
tr[lc].sm+=(mid-l+1)*tr[x].ad%q;tr[rc].sm+=(r-mid)*tr[x].ad%q;
tr[lc].ad+=tr[x].ad%q;tr[rc].ad+=tr[x].ad%q;
tr[x].ad=0;
}
}
void modifyad(int x,int l,int r,int L,int R,int d){
if(l==L&&r==R) {
tr[x].sm+=(r-l+1)*d;
tr[x].ad+=d;
return;
}
int mid=l+r >>1;
pushdown(x,l,r);
if(R<=mid) modifyad(lc,l,mid,L,R,d);
else if(L>mid) modifyad(rc,mid+1,r,L,R,d);
else modifyad(lc,l,mid,L,mid,d),modifyad(rc,mid+1,r,mid+1,R,d);
update(x);
}
void modifymul(int x,int l,int r,int L,int R,int d){
if(l==L&&r==R) {
tr[x].ad*=d%q;
tr[x].sm*=d%q;
tr[x].mul*=d%q;
return;
}
int mid=l+r >>1;
pushdown(x,l,r);
if(R<=mid) modifymul(lc,l,mid,L,R,d);
else if(L>mid) modifymul(rc,mid+1,r,L,R,d);
else modifymul(lc,l,mid,L,mid,d),modifymul(rc,mid+1,r,mid+1,R,d);
update(x);
}
int query(int x,int l,int r,int L,int R){
if(l==l&&r==R) return tr[x].sm;
int mid=l+r>>1;
pushdown(x,l,r);
if(R<=mid) return query(lc,l,mid,L,R);
else if(L>mid) return query(rc,mid+1,r,L,R);
else return query(lc,l,mid,L,mid)+query(rc,mid+1,r,mid+1,R);
}
int main(){
//freopen(" ","r",stdin);
//freopen(" ","w",stdout);
cin>> n >> m>>q ;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
int op,x,y,k;
scanf("%d%d%d",&op,&x,&y);
if(op==1){
cin>> k;
modifymul(1,1,n,x,y,k);
}
if(op==2){
cin>> k;
modifyad(1,1,n,x,y,k);
}
if(op==3){
cout << query(1,1,n,x,y)%q<<'\n';
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...