#include<iostream> #include<cstdio> using namespace std; struct node { int l, r, m; int max; }num[800005]; int val[200005]; int n, m; int init(int l, int r, int k) { num[k].l = l; num[k].r = r; if(l==r) { num[k].m = l; num[k].max=val[l]; return val[l]; } num[k].m = (l+r)>>1; num[k].max = max(init(l,num[k].m,k+k),init(num[k].m+1,r,k+k+1)); return num[k].max; } void update(int x,int y,int k) { if(num[k].l==num[k].r) { num[k].max = y; return; } if(x>num[k].m) update(x,y,k+k+1); else update(x,y,k+k); num[k].max=max(num[k+k].max,num[k+k+1].max); } int ans(int l, int r, int k) { if(num[k].l==l && num[k].r==r) { return num[k].max; } else if(l>num[k].m){ return ans(l,r,k+k+1); } else if(r<=num[k].m) { return ans(l,r,k+k); } else return max(ans(l,num[k].m,k+k),ans(num[k].m+1,r,k+k+1)); } int main() { char str[5]; int a, b; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&val[i]); init(1,n,1); while(m--) { scanf("%s%d%d",str,&a,&b); if(str[0]=='U') update(a,b,1); else printf("%d ",ans(a,b,1)); } } }
Code From Hdu 1754
版权声明:本文为博主原创文章,未经博主允许不得转载。