社区讨论
30pts求助,玄关,良好马蜂
P3373【模板】线段树 2参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mjl9texz
- 此快照首次捕获于
- 2025/12/25 17:59 2 个月前
- 此快照最后确认于
- 2025/12/27 16:30 2 个月前
CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define ls i<<1
#define rs i<<1|1
using namespace std;
const int N=1e5+10;
int n,q,m,x,y,k,a[N];
char c;
struct Q{
int l,r,sum,tag1,tag2;
}t[N<<2];
inline void mod(int x){x%=m;}
inline void up(int i){t[i].sum=(t[ls].sum+t[rs].sum)%m;}
inline void spread(int i){
t[ls].sum=t[ls].sum*t[i].tag1+(t[ls].r-t[ls].l+1)*t[i].tag2;
t[rs].sum=t[rs].sum*t[i].tag1+(t[rs].r-t[rs].l+1)*t[i].tag2;
mod(t[ls].sum),mod(t[rs].sum);
t[ls].tag1*=t[i].tag1;
t[rs].tag1*=t[i].tag1;
mod(t[ls].tag1),mod(t[rs].tag1);
t[ls].tag2=t[ls].tag2*t[i].tag1+t[i].tag2;
t[rs].tag2=t[rs].tag2*t[i].tag1+t[i].tag2;
mod(t[ls].tag2),mod(t[rs].tag2);
t[i].tag1=1,t[i].tag2=0;
}inline void build(int i,int l,int r){
t[i].l=l;t[i].r=r;
t[i].tag1=1,t[i].tag2=0;
if(l==r){
t[i].sum=a[l];
return;
}int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
up(i);
}inline void change1(int i,int l,int r,int k){
if(l<=t[i].l&&t[i].r<=r){
t[i].sum*=k;
mod(t[i].sum);
t[i].tag1*=k;
mod(t[i].tag1);
t[i].tag2*=k;
mod(t[i].tag2);
return;
}spread(i);
int mid=(t[i].l+t[i].r)>>1;
if(l<=mid) change1(ls,l,r,k);
if(r>mid) change1(rs,l,r,k);
up(i);
}inline void change2(int i,int l,int r,int k){
if(l<=t[i].l&&t[i].r<=r){
t[i].sum+=(t[i].r-t[i].l+1)*k;
mod(t[i].sum);
t[i].tag2+=k;
mod(t[i].tag2);
return;
}spread(i);
int mid=(t[i].l+t[i].r)>>1;
if(l<=mid) change2(ls,l,r,k);
if(r>mid) change2(rs,l,r,k);
up(i);
}inline int ask(int i,int l,int r){
if(l<=t[i].l&&t[i].r<=r)
return t[i].sum%m;
spread(i);
int ans=0,mid=(t[i].l+t[i].r)>>1;
if(l<=mid) ans=(ans+ask(ls,l,r))%m;
if(r>mid) ans=(ans+ask(rs,l,r))%m;
return ans%m;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>q>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
mod(a[i]);
}
build(1,1,n);
while(q--){
cin>>c;
if(c=='1'){
cin>>x>>y>>k;
change1(1,x,y,k);
}else if(c=='2'){
cin>>x>>y>>k;
change2(1,x,y,k);
}else{
cin>>x>>y;
cout<<ask(1,x,y)<<endl;
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...