代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 2e5+10; ll arr[maxn]; struct SegTree { ll Max[maxn<<2],cnt[maxn<<2],lz[maxn<<2]; void init() { memset(Max,0,sizeof(Max)); memset(cnt,0,sizeof(cnt)); memset(lz,0,sizeof(lz)); } void push_up(int rt) { Max[rt] = max(Max[rt<<1],Max[rt<<1|1]); cnt[rt] = cnt[rt<<1] + cnt[rt<<1|1]; } void push_down(int rt) { if(!lz[rt]) return ; lz[rt<<1] = lz[rt]; lz[rt<<1|1] = lz[rt]; Max[rt<<1] = lz[rt]; Max[rt<<1|1] = lz[rt]; lz[rt] = 0; } void build(ll arr[],int l,int r,int rt) { if(l == r) { Max[rt] = arr[l]; cnt[rt]++; return; } push_down(rt); int mid = (l + r) >> 1; build(arr,l,mid,rt<<1); build(arr,mid+1,r,rt<<1|1); push_up(rt); } void activate(int pos,ll val,int l,int r,int rt) { if(l == r) { Max[rt] += val; cnt[rt] ++; return ; } push_down(rt); int mid = (l + r) >> 1; if(pos <= mid) activate(pos,val,l,mid,rt<<1); else activate(pos,val,mid+1,r,rt<<1|1); push_up(rt); } void update(int pos,ll val,int l,int r,int rt) { if(l == r) { Max[rt] = val; lz[rt] = val; return; } push_down(rt); int mid = (l + r) >> 1; if(pos <= mid) update(pos,val,l,mid,rt<<1); else update(pos,val,mid+1,r,rt<<1|1); push_up(rt); } void update(int ql,int qr,ll val,int l,int r,int rt) { if(ql == l && qr == r) { Max[rt] = val; lz[rt] = val; return; } push_down(rt); int mid = (l + r) << 1; if(qr <= mid) update(ql,qr,l,mid,rt<<1); else if(ql > mid) update(ql,qr,mid+1,r,rt<<1|1); else { update(ql,mid,l,mid,rt<<1); update(mid+1,qr,mid+1,r,rt<<1|1); } push_up(rt); } ll query(int ql,int qr,int l,int r,int rt) { if(ql == l && qr == r) { return Max[rt]; } push_down(rt); int mid = (l + r) >> 1; if(qr <= mid) return query(ql,qr,l,mid,rt<<1); if(ql > mid) return query(ql,qr,mid+1,r,rt<<1|1); return max(query(ql,mid,l,mid,rt<<1),query(mid+1,qr,mid+1,r,rt<<1|1)); } }seg; int main() { int n,m; char ch; while(~scanf("%d%d",&n,&m)) { int pos,l,r; ll val; for(int i=1;i<=n;i++) scanf("%lld",&arr[i]); seg.init(); seg.build(arr,1,n,1); while(m--) { getchar(); scanf("%c",&ch); if(ch == 'Q') { scanf("%d%d",&l,&r); printf("%lld\n",seg.query(l,r,1,n,1)); } else if(ch == 'U') { scanf("%d%lld",&pos,&val); seg.update(pos,val,1,n,1); } } } return 0; }
Max[] 更新时直接赋值,因为是覆盖,lz[]同理
push_down()同理