本题是一个简单的线段树 与hdu的1166题相似
树状数组模拟线段树 进行节点的更新与查询
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define mem(a) memset(a,0,sizeof(a)) using namespace std; int a[5005000]; int sum; void updat(int id,int l,int r,int mid,int pos){ if(l==r){ a[mid]=pos; return; } int i=(l+r)>>1; if(id<=i)updat(id,l,i,2*mid,pos); else updat(id,i+1,r,2*mid+1,pos); a[mid]=max(a[2*mid],a[2*mid+1]); } void su(int l,int r,int mid,int ll,int rr){ if(l>=ll&&r<=rr){ sum=max(sum,a[mid]); return; } int i=(l+r)>>1; if(ll<=i)su(l,i,2*mid,ll,rr); if(rr>i)su(i+1,r,2*mid+1,ll,rr); } int main() { int n,m,pos,x1,x2; while(scanf("%d%d",&m,&n)!=EOF){ mem(a); for(int i=1; i<=m; i++){ scanf("%d",&pos); updat(i,1,m,1,pos); } while(n--){ char c[5]; scanf("%s",c);//采用字符串 字符的话要吃回车 if(!strcmp(c,"Q")){ scanf("%d%d",&x1,&x2); sum=0; su(1,m,1,x1,x2); printf("%d\n",sum); } if(!strcmp(c,"U")){ scanf("%d%d",&x1,&x2); updat(x1,1,m,1,x2); } } } return 0; }