hdu-1754

http://acm.hdu.edu.cn/showproblem.php?pid=1754

裸的线段树

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dir[8][2]={{1,0},{0,1},{1,1},{1,-1},{-1,1},{-1,-1},{0,-1},{-1,0}};
#define pi acos(-1)
#define ls rt<<1
#define rs rt<<1|1
#define me0(s) memset(s,0,sizeof(s))
#define me1(s) memset(s,1,sizeof(s))
#define mef(s) memset(s,-1,sizeof(s))
#define meinf(s) memset(s,inf,sizeof(s))
#define llinf 1e18
#define inf 1e9
const int N=2e6+6;
int n,q;
int Max[N*4],a[N*4];
void pushup(int rt){
    Max[rt]=max(Max[ls],Max[rs]);
}
void build(int l,int r,int rt){
    if(l==r){
        Max[rt]=a[l];
        return;
    }
    int m=(l+r)>>1;
    build(l,m,ls);
    build(m+1,r,rs);
    pushup(rt);
}
void update(int l,int r,int p,int c,int rt){
    if(l==r){
        Max[rt]=c;
        return ;
    }
    int m=(l+r)>>1;
    if(p<=m) update(l,m,p,c,ls);
    else update(m+1,r,p,c,rs);
    pushup(rt);
}
int query(int L,int R,int l,int r,int rt){//L,R查询的区间,l,r总区间
    if(L<=l&&R>=r){
        return Max[rt];
    }
    int ans=0;
    int m=(l+r)/2;
    if(L<=m) ans=max(ans,query(L,R,l,m,ls));
    if(R>m) ans=max(ans,query(L,R,m+1,r,rs));
    return ans;
}
int main(int argc, char * argv[]){
    ios::sync_with_stdio(false);
    while(scanf("%d%d",&n,&q)!=EOF){
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        build(1,n,1);
        while(q--){
            char cc;
            getchar();
            scanf("%c",&cc);
            int l,r;
            if(cc=='Q'){
                scanf("%d%d",&l,&r);
                printf("%d\n",query(l,r,1,n,1));
            }
            else{
                int c,p;
                scanf("%d%d",&c,&p);
                update(1,n,c,p,1);
            }
        }        
    }
    return 0;
}

 

posted @ 2019-10-30 20:22  wushuyng  阅读(96)  评论(0编辑  收藏  举报