hdu 1754

来源:互联网 发布:瘦大腿知乎 编辑:程序博客网 时间:2024/05/16 14:39

题目

PushUp是改为求其最大值,update是单点值的替换

#include<iostream>#include<cstdio>using namespace std;#define maxn 200005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define inf 1<<30struct Tree{    int l,r,num;}tree[maxn<<2];void PushUp(int rt){    tree[rt].num=max(tree[rt<<1].num,tree[rt<<1|1].num);}void build(int l,int r,int rt){    tree[rt].l=l;    tree[rt].r=r;    if(l==r){        scanf("%d",&tree[rt].num);        return ;    }    int m=(l+r)>>1;    build(lson);    build(rson);    PushUp(rt);}void update(int pos,int val,int rt){    int l,r;    l=tree[rt].l;    r=tree[rt].r;    if(l==r){        tree[rt].num=val;        return ;    }    int m=(l+r)>>1;    if(pos<=m)        update(pos,val,rt<<1);    else        update(pos,val,rt<<1|1);    PushUp(rt);}int query(int x,int y,int rt){    int l,r;    l=tree[rt].l;    r=tree[rt].r;    if(x==l&&r==y){        return tree[rt].num;    }    int m=(l+r)>>1,ans=-inf;    if(x<=m) ans=max(ans,query(x,min(m,y),rt<<1));    if(m<y) ans=max(ans,query(max(m+1,x),y,rt<<1|1));        return ans;}int main(){    int n,m;    while(~scanf("%d%d",&n,&m)){        build(1,n,1);        char ch[10];        while(m--)        {            scanf("%s",ch);            int a,b;            scanf("%d%d",&a,&b);            if(ch[0]=='Q') printf("%d\n",query(a,b,1));            else              update(a,b,1);        }    }    return 0;}


原创粉丝点击