HDU1754 I 单点更新,区间最值

来源:互联网 发布:网络发展新技术 编辑:程序博客网 时间:2024/06/09 14:01

HDU1754I Hate It
简单的线段树,单点更新及区间最值,不需优化,更新到叶子节点

#include<cstdio>#include<algorithm>using namespace std;struct node{    int left,right;    int Max;}tree[200000*4];int p,v;///把p点的值改为vvoid Build(int l,int r,int cur){    tree[cur].left=l;    tree[cur].right=r;    if(l==r){        scanf("%d",&tree[cur].Max);        return ;    }    int mid=(l+r)/2;    Build(l,mid,cur*2);    Build(mid+1,r,cur*2+1);    tree[cur].Max=max(tree[cur*2].Max,tree[cur*2+1].Max);}void Update(int cur){    if(tree[cur].left==tree[cur].right&&tree[cur].left==p){        tree[cur].Max=v;        return ;    }    int mid=(tree[cur].left+tree[cur].right)/2;    if(p<=mid)Update(cur*2);    else Update(cur*2+1);    tree[cur].Max=max(tree[cur*2].Max,tree[cur*2+1].Max);}int Query(int l,int r,int cur){    if(l==tree[cur].left&&r==tree[cur].right)return tree[cur].Max;    int mid=(tree[cur].left+tree[cur].right)/2;    if(r<=mid)return Query(l,r,cur*2);    else if(l>mid)return Query(l,r,cur*2+1);    else return max(Query(l,mid,cur*2),Query(mid+1,r,cur*2+1));}int main(){    int n,m,a,b;    char c;    while(scanf("%d%d",&n,&m)!=EOF){        Build(1,n,1);        while(m--){            getchar();            scanf("%c%d%d",&c,&a,&b);            if(c=='Q')printf("%d\n",Query(a,b,1));            else {p=a;v=b;Update(1);}        }    }    return 0;}
0 0
原创粉丝点击