HDU 1754 I Hate It(线段树_单点更新)

来源:互联网 发布:java常用设计模式详解 编辑:程序博客网 时间:2024/06/06 12:25

支持两种操作

Q x y    查询 [x,y]区间内的最大值。

U  x y   将x位置的点值更新为y;

线段树模板水过

#include <iostream>#include <stdio.h>#include <string.h>using namespace std;const int N=200000+5;struct tree{    int a[N<<2];    void push(int cur)    {        a[cur]=max(a[cur<<1],a[cur<<1|1]);    }    void build(int nod,int l,int r)    {        if(l==r)        {            scanf("%d",&a[nod]);            return;        }        int mid=(l+r)>>1;        build(nod<<1,l,mid);        build(nod<<1|1,mid+1,r);        push(nod);    }    void update(int n,int v,int l,int r,int cur)    {        if(l==r)        {            a[cur]=v;            return;        }        int mid=(l+r)>>1;        if(n<=mid)            update(n,v,l,mid,2*cur);        else            update(n,v,mid+1,r,2*cur+1);        push(cur);    }    int query(int c,int b,int l,int r,int cur)    {        if(c<=l&&b>=r)            return a[cur];        int mid=(l+r)>>1;        int ans=0,tmp;        if(c<=mid)        {            tmp=query(c,b,l,mid,2*cur);            if(tmp>ans)               ans=tmp;        }        if(b>mid)        {            tmp=query(c,b,mid+1,r,2*cur+1);            if(tmp>ans)               ans=tmp;        }        return ans;    }}si;int main(){    int n,m;    int x,y;    char ord[10];    while(scanf("%d%d",&n,&m)==2)    {        si.build(1,1,n);        while(m--)        {            scanf("%s",ord);            if(ord[0]=='Q')            {                scanf("%d%d",&x,&y);                printf("%d\n",si.query(x,y,1,n,1));            }            if(ord[0]=='U')            {                scanf("%d%d",&x,&y);                si.update(x,y,1,n,1);            }        }    }    return 0;}


0 0