HDU 1754 线段树裸题
水题
#include<stdio.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define Maxn 205555 int max[Maxn<<2]; int N,M; void Pushup(int rt) { max[rt]=max[rt<<1]>max[rt<<1|1]?max[rt<<1]:max[rt<<1|1]; } void build(int l,int r,int rt) { int m; if(l==r){scanf("%d\n",&max[rt]);return ;} m=(l+r)>>1; build(lson); build(rson); Pushup(rt); } int updata(int p,int k,int l,int r,int rt) { int m; if(l==r){max[rt]=k;return 0;} m=(l+r)>>1; if(p<=m) updata(p,k,lson); else updata(p,k,rson); Pushup(rt); } int query(int L,int R,int l,int r,int rt) { int m,k1=0,k2=0; if(L<=l&&r<=R) return max[rt]; m=(l+r)>>1; if(L<=m) k1=query(L,R,lson); if(R>m) k2=query(L,R,rson); return k1>k2?k1:k2; } int main() { int i,a,b; char ch; while(scanf("%d%d",&N,&M)==2) { build(1,N,1); for(i=1;i<=M;i++) { scanf("%c%d%d\n",&ch,&a,&b); if(ch=='U') updata(a,b,1,N,1); if(ch=='Q') printf("%d\n",query(a,b,1,N,1)); } } return 0; }