HDU

题目链接

线段树,单点修改,区间最大值查询。


#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
int n,m;

#define mid ((l + r) >> 1)
#define ls (nod << 1)
#define rs (nod << 1 | 1)
#define lson ls,l,mid
#define rson rs,mid + 1, r

int mx[N << 2];
void pushup(int nod) { mx[nod] = max(mx[ls], mx[rs]); }
void build(int nod,int l,int r){
    if(l == r) { scanf("%d",&mx[nod]); return ; }
    build(lson); build(rson); pushup(nod);
}
void update(int nod,int l,int r,int pos,int v){
   if(l == r) { mx[nod] = v; return ;}
   if(pos <= mid) update(lson,pos,v); else update(rson,pos,v);
   pushup(nod);
}
int query(int nod,int l,int r,int ll,int rr){
    if(l > rr || r < ll) return -2000000000;
    if(ll <= l && r <= rr) return mx[nod];
    return max(query(lson,ll,rr), query(rson,ll,rr));
}

int main(){
    while(scanf("%d%d",&n,&m) != EOF){
        build(1,1,n);
        while(m --){
            char c;
            scanf(" %c",&c);
            if(c == 'Q'){
                int x,y; scanf("%d%d",&x,&y);
                if(x > y) swap(x,y);
                printf("%d
",query(1,1,n,x,y));
            }
            if(c == 'U'){
                int x,y; scanf("%d%d",&x,&y);
                update(1,1,n,x,y);
            }
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/zzhzzh123/p/13399235.html