社区讨论
性感代码在线求调教(回复必关)
P3373【模板】线段树 2参与者 4已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @lrx97ght
- 此快照首次捕获于
- 2024/01/28 16:43 2 年前
- 此快照最后确认于
- 2024/01/28 19:08 2 年前
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+10;
ll n,q,Mod,tem,a[N],d[4*N],b[4*N],b_[4*N];
void build(ll s,ll t,ll p){
b_[p]=1;
if (s==t){
d[p]=a[s]%Mod;
return ;
}
ll m=s+t>>1;
build(s,m,p*2);
build(m+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
d[p]%=Mod;
}
void update(ll s,ll t,ll c,ll w,ll p){
b_[p]=(b_[p]*c)%Mod;
b[p]=(b[p]*c)%Mod;
b[p]=(b[p]+w)%Mod;
d[p]=(d[p]*c+(t-s+1)*w)%Mod;
return ;
}
void push(ll s,ll t,ll p){
ll mid=s+t>>1;
update(s,mid,b_[p],b[p],p*2);
update(mid+1,t,b_[p],b[p],p*2+1);
b[p]=0;
b_[p]=1;
}
void mainly(ll l,ll r,ll c,ll w,ll s,ll t,ll p){
if (s>=l&&t<=r){
update(s,t,c,w,p);
return;
}
push(s,t,p) ;
ll mid=s+t>>1;
if (s<=mid) mainly(l,r,c,w,s,mid,p*2);
if (t>mid) mainly(l,r,c,w,mid+1,t,p*2+1);
d[p]=(d[p*2]+d[p*2+1])%Mod;
}
ll getsum(ll l,ll r,ll s,ll t,ll p){
if (s>=l&&t<=r){
return d[p]%Mod;
}
ll mid=s+t>>1;
push(s,t,p);
ll ans=0;
if (mid>=l) ans=(ans+getsum(l,r,s,mid,p*2))%Mod;
if (mid<r) ans=(ans+getsum(l,r,mid+1,t,p*2+1))%Mod;
return ans%Mod;
}
int main(){
scanf ("%lld%lld%lld",&n,&q,&Mod);
for (ll i=1;i<=n;i++)
scanf ("%lld",&a[i]);
build(1,n,1);
for (ll i=1;i<=q;i++){
scanf ("%lld",&tem);
if (tem==1){
ll x,y,k;
scanf ("%lld%lld%lld",&x,&y,&k);
mainly(x,y,k,0,1,n,1);
}
if (tem==2){
ll x,y,k;
scanf ("%lld%lld%lld",&x,&y,&k);
mainly(x,y,1,k,1,n,1);
}
if (tem==3){
ll x,y;
scanf ("%lld%lld",&x,&y);
printf ("%lld\n",getsum(x,y,1,n,1));
}
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...