hdu1754 線段樹單點更新模板
阿新 • • 發佈:2018-12-15
程式碼:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ls(o) o<<1 #define rs(o) o<<1|1 const int maxn=800010; struct node { int l,r; int ans; }nd[maxn]; int st[200010]; int n,m; void build(int l,int r,int o) { nd[o].l=l,nd[o].r=r; if(l==r) { nd[o].ans=st[l]; return ; } int mid=(l+r)>>1; build(l,mid,o<<1); build(mid+1,r,o<<1|1); nd[o].ans=max(nd[o<<1].ans,nd[o<<1|1].ans); } inline void add(int s,int o,int x) { if(nd[o].l==nd[o].r&&nd[o].l==s) { nd[o].ans=x; return ; } int mid=(nd[o].l+nd[o].r)>>1; if(s<=mid) add(s,o<<1,x); else add(s,o<<1|1,x); nd[o].ans=max(nd[o<<1].ans,nd[o<<1|1].ans); } inline int query(int l,int r,int o) { if(nd[o].l>=l&&nd[o].r<=r) return nd[o].ans; int mid=(nd[o].l+nd[o].r)>>1; if(r<=mid) return query(l,r,o<<1); else if(l>mid) return query(l,r,o<<1|1); else return max(query(l,mid,o<<1),query(mid+1,r,o<<1|1)); } int main() { ios::sync_with_stdio(false); while(scanf("%d %d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&st[i]); build(1,n,1); getchar(); for(int i=0;i<m;i++) { char c; int a,b; scanf("%c %d %d",&c,&a,&b); getchar(); if(c=='Q') { int ans=query(a,b,1); printf("%d\n",ans); } else if(c=='U') { add(a,1,b); } } } return 0; }