#include <bits/stdc++.h> using namespace std; #define LL long long const int maxn=2e5+10; struct BIT //binary index tree { int t[maxn],n; int a[maxn]; #define lowbit(x) (x&(-x)) void init(int n_) { n=n_; for(int i=1;i<=n;i++) t[i]=0; for(int i=1;i<=n;i++) { scanf("%d",a+i); modify(i,a[i]); } } int query(int l,int r) { int res=a[r]; while(r>l) //t[i]维护 [i-lowbit(i)+1,i]的最值 { for(--r;r-lowbit(r)>=l;r-=lowbit(r))// r-lowbit(r)+1>=l return max t[r],query(l,r-low(r)) res=max(res,t[r]); // r-lowbit(r)+1<l return max a[r],query(l,r-1) res=max(res,a[r]); } return res; } void modify(int x,int v) { a[x]=v; while(x<=n) { t[x]=a[x]; for(int i=1,j=lowbit(x);i<j;i<<=1)// y+( lowbit(y)=2^i) =x t[x]=max(t[x],t[x-i]); // 对pos=x的修改需要考虑其维护的(x-lowbit(x),x]区间里的数对该区间最值贡献 x+=lowbit(x); //转移至包含该区间的下一个位置 } } }; BIT t; int main() { #ifdef shuaishuai freopen("in.txt","r",stdin); #endif // shuaishuai int n,q; while(~scanf("%d%d",&n,&q)) { t.init(n); for(char s[2];q--;) { int a,b; scanf("%s%d%d",s,&a,&b); if(s[0]=='U') t.modify(a,b); else { if(a>b)swap(a,b); printf("%d\n",t.query(a,b)); } } } return 0; }
区间最值查询 单点修改 树状数组
猜你喜欢
转载自www.cnblogs.com/polya/p/9770335.html
今日推荐
周排行