社区讨论
求调线段树,啾啾孩子
P3373【模板】线段树 2参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lobc0h3b
- 此快照首次捕获于
- 2023/10/29 18:32 2 年前
- 此快照最后确认于
- 2023/11/04 00:20 2 年前
CPP
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#define re register
#define ll long long
#define maxx 100005
#define lson id*2
#define rson id*2+1
using namespace std;
inline int read(){
int x=0;int f=1;char c=getchar();
while(c>'9'||c<'0'){if(c==-1)f=-1;c=getchar();
}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();
}
return x*f;
}
inline ll lread(){
ll x=0;int f=1;char c=getchar();
while(c>'9'||c<'0'){if(c==-1)f=-1;c=getchar();
}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();
}
return x*f;
}
int n,m,MOD;
int a[maxx];
struct node{
int left,right;
ll sum;
int Jia;
int Sheng;
}A[maxx*4];
inline void pushup(int id,int l,int r){
A[id].sum=A[lson].sum+A[rson].sum;
A[id].sum=A[id].sum%MOD;
return ;
}
inline void build(int id,int l,int r){
if(r<l) return ;
A[id].left=l;
A[id].right=r;
A[id].Jia=0;
A[id].Sheng=1;
if(l==r){
A[id].sum=a[l];
return ;
}
int mid=(l+r)/2;
build(lson,l,mid);
build(rson,mid+1,r);
pushup(id,l,r);
return ;
}
inline void Add_J(int id,int l,int r,int v){
A[id].Jia+=v;
A[id].Jia=A[id].Jia%MOD;
A[id].sum+=(r-l+1)*v;
A[id].sum=A[id].sum%MOD;
return ;
}
inline void Add_S(int id,int l,int r,int v){
A[id].Sheng=(A[id].Sheng*v)%MOD;
A[id].Jia=(A[id].Jia*v)%MOD;
A[id].sum*=v;
A[id].sum=A[id].sum%MOD;
return ;
}
inline void Add(int id,int l,int r,int jia,int mul){
A[id].sum=(A[id].sum*mul+(jia*(r-l+1)))%MOD;
A[id].Jia=(A[id].Jia*mul+jia)%MOD;
A[id].Sheng=(A[id].Sheng*mul)%MOD;
return ;
}
inline void pushdown(int id,int l,int r,int mid){
Add(lson,l,mid,A[id].Jia,A[id].Sheng);
Add(rson,mid+1,r,A[id].Jia,A[id].Sheng);
/*
Add_S(lson,l,mid,A[id].Sheng);
Add_J(lson,l,mid,A[id].Jia);
Add_S(rson,mid+1,r,A[id].Sheng);
Add_J(rson,mid+1,r,A[id].Jia);
*/
A[id].Jia=0;A[id].Sheng=1;
return ;
}
inline void change_J(int id,int l,int r,int x,int y,int v){
if(x>r||y<l) return ;
if(x<=l&&y>=r){
Add_J(id,l,r,v);
return ;
}
int mid=(l+r)/2;
pushdown(id,l,r,mid);
if(x<=mid){change_J(lson,l,mid,x,y,v);
}
if(y>mid){change_J(rson,mid+1,r,x,y,v);
}
pushup(id,l,r);
return ;
}
inline void change_S(int id,int l,int r,int x,int y,int v){
if(x>r||y<l) return ;
if(x<=l&&y>=r){
Add_S(id,l,r,v);
return ;
}
int mid=(l+r)/2;
pushdown(id,l,r,mid);
if(x<=mid){change_S(lson,l,mid,x,y,v);
}
if(y>mid){change_S(rson,mid+1,r,x,y,v);
}
pushup(id,l,r);
return ;
}
inline ll qun(int id,int l,int r,int x,int y){
if(x<=l&&y>=r){
return A[id].sum;
}
int mid=(l+r)/2;
pushdown(id,l,r,mid);
ll ans=0;
if(x<=mid) ans+=qun(lson,l,mid,x,y);
if(y>mid) ans+=qun(rson,mid+1,r,x,y);
return ans;
}
int main(){
n=read();m=read();MOD=read();
for(re int i=1;i<=n;i++){
a[i]=lread();
a[i]=a[i]%MOD;
}
build(1,1,n);
while(m--){
int kind=read();
if(kind==1){
int x,y,v;
x=read();y=read();v=read();
v=v%MOD;
change_S(1,1,n,x,y,v);
}
if(kind==2){
int x,y,v;
x=read();y=read();v=read();
v=v%MOD;
change_J(1,1,n,x,y,v);
}
if(kind==3){
int x,y;
x=read();y=read();
printf("%lld\n",qun(1,1,n,x,y)%MOD);
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...