代码无法运行,但交到oj直接ac了
//势能线段树
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define PII pair<int,int>
#define endl "\n"
#define int long long
const int N=1e5+10;
struct segment_tree {
int a[N];
struct node {
int l,r;
int mx,sum;
}tr[N<<2];
void build(int u,int l,int r) {
tr[u].l=l,tr[u].r=r;
if(l==r) {
tr[u].mx=tr[u].sum=a[l];
return ;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void modify(int u,int l,int r,int x) {
if(tr[u].mx<x) return ;
if(tr[u].l==tr[u].r) {
tr[u].mx%=x;
tr[u].sum=tr[u].mx;
return ;
}
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid) modify(u<<1,l,r,x);
if(r>mid) modify(u<<1|1,l,r,x);
pushup(u);
}
int query(int u,int l,int r) {
if(tr[u].l>=l&&tr[u].r<=r) {
return tr[u].sum;
}
int mid=(tr[u].l+tr[u].r)>>1;
int res=0;
if(l<=mid) res+=query(u<<1,l,r);
if(r>mid) res+=query(u<<1|1,l,r);
return res;
}
void update(int u,int k,int x) {
if(tr[u].l==tr[u].r) {
tr[u].mx=tr[u].sum=x;
return ;
}
int mid=(tr[u].l+tr[u].r)>>1;
if(k<=mid) update(u<<1,k,x);
else update(u<<1|1,k,x);
pushup(u);
}
void pushup(int u) {
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);
}
};
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n,m;
cin>>n>>m;
segment_tree ST;
for(int i=1;i<=n;i++) cin>>ST.a[i];
ST.build(1,1,n);
while(m--) {
int op,l,r,k,x;
cin>>op;
if(op==1) {
cin>>l>>r;
cout<<ST.query(1,l,r)<<endl;
}
else if(op==2) {
cin>>l>>r>>x;
ST.modify(1,l,r,x);
}
else {
cin>>k>>x;
ST.update(1,k,x);
}
}
}