樹狀陣列求區間最值和單點更新
阿新 • • 發佈:2018-11-11
題目連結:https://cn.vjudge.net/contest/66989#problem/B
AC程式碼:
#include<iostream> #include<string> #include<cstring> #include<cmath> #include<stdio.h> #include<iomanip> #include<algorithm> using namespace std; # define ll long long # define maxn 200000+100 int n,m; int a[maxn]; int h[maxn]; int lowbit(int t) { return t&(-t); } void update(int t) { while(t<=n) { h[t]=a[t]; int len=lowbit(t); for(int i=1; i<len; i<<=1) { h[t]=max(h[t],h[t-i]); } t+=lowbit(t); } } int query(int t1,int t2) { int ans=0; while(t1<=t2) { ans=max(ans,a[t2]); t2--; while(t2-lowbit(t2)>=t1) { ans=max(ans,h[t2]); t2-=lowbit(t2); } } return ans; } int main() { while(~scanf("%lld%lld",&n,&m)) { memset(a,0,sizeof(a)); memset(h,0,sizeof(h)); for(int i=1; i<=n; i++) { scanf("%lld",&a[i]); update(i); } while(m--) { char str[10]; int t1,t2; scanf("%s",str); if(str[0]=='Q') { scanf("%d%d",&t1,&t2); int ans=query(t1,t2); printf("%d\n",ans); } else if(str[0]=='U') { scanf("%d%d",&t1,&t2); a[t1]=t2; update(t1); } } } return 0; }