RT,代码:
#include <bits/stdc++.h>
#define N 1ll00005
#define int long long
using namespace std;
int n,m,i,a[N],op,x,y,z;
struct SegmentTree{
int l,r,x,mx;
}tr[N<<2ll];
void push_up(int pos){
tr[pos].x=tr[pos<<1ll].x+tr[pos<<1ll|1ll].x;
tr[pos].mx=max(tr[pos<<1ll].mx,tr[pos<<1ll|1ll].mx);
}
void build(int pos,int l,int r){
tr[pos].l=l,tr[pos].r=r;
if (l==r){
tr[pos].x=a[l],tr[pos].mx=a[l];
return ;
}
int mid=(l+r)>>1ll;
build(pos<<1ll,l,mid);
build(pos<<1ll|1ll,mid+1ll,r);
push_up(pos);
}
void gmod(int pos,int l,int r,int p){
if (tr[pos].mx<p) return ;
if (tr[pos].l==tr[pos].r){
tr[pos].x%=p,tr[pos].mx%=p;
return ;
}
int mid=(tr[pos].l+tr[pos].r)>>1ll;
if (l<=mid) gmod(pos<<1ll,l,mid,p);
if (r>mid) gmod(pos<<1ll|1ll,mid+1ll,r,p);
push_up(pos);
}
void gpot(int pos,int x,int v){
if (tr[pos].l==tr[pos].r && tr[pos].l==x){
tr[pos].x=v,tr[pos].mx=v;
return ;
}
int mid=(tr[pos].l+tr[pos].r)>>1ll;
if (x<=mid) gpot(pos<<1ll,x,v);
if (x>mid) gpot(pos<<1ll|1ll,x,v);
push_up(pos);
}
int query(int pos,int l,int r){
if (l<=tr[pos].l && tr[pos].r<=r) return tr[pos].x;
int mid=(tr[pos].l+tr[pos].r)>>1ll;
int ans=0;
if (l<=mid) ans+=query(pos<<1ll,l,r);
if (r>mid) ans+=query(pos<<1ll|1ll,l,r);
return ans;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for (i=1ll;i<=n;i++) cin>>a[i];
build(1ll,1ll,n);
for (i=1ll;i<=m;i++){
cin>>op;
if (op==1ll) cin>>x>>y,cout<<query(1ll,x,y)<<'\n';
else if (op==2ll) cin>>x>>y>>z,gmod(1ll,x,y,z);
else cin>>x>>z,gpot(1ll,x,z);
}
return 0;
}
第二次提交在最后加了 //,评测结果: