Segment Tree

来源:互联网 发布:htpp js.shxedc.com 编辑:程序博客网 时间:2024/05/22 03:42
#include<iostream>#include<cstdio>using namespace std;struct node{    int l, r, m;    int max;}num[800005];int val[200005];int n, m;int init(int l, int r, int k){    num[k].l = l;    num[k].r = r;    if(l==r)    {        num[k].m = l;        num[k].max=val[l];        return val[l];    }    num[k].m = (l+r)>>1;    num[k].max = max(init(l,num[k].m,k+k),init(num[k].m+1,r,k+k+1));    return num[k].max;}void update(int x,int y,int k){    if(num[k].l==num[k].r)        {        num[k].max = y;        return;    }    if(x>num[k].m)    update(x,y,k+k+1);    else update(x,y,k+k);    num[k].max=max(num[k+k].max,num[k+k+1].max);}int ans(int l, int r, int k){    if(num[k].l==l && num[k].r==r)    {        return num[k].max;    }    else if(l>num[k].m){        return ans(l,r,k+k+1);    }    else if(r<=num[k].m)    {        return ans(l,r,k+k);    }    else    return max(ans(l,num[k].m,k+k),ans(num[k].m+1,r,k+k+1));}int main(){    char str[5];    int a, b;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=1;i<=n;i++)    scanf("%d",&val[i]);        init(1,n,1);        while(m--)        {            scanf("%s%d%d",str,&a,&b);            if(str[0]=='U')    update(a,b,1);            else     printf("%d\n",ans(a,b,1));        }            }}

Code From Hdu 1754
0 0
原创粉丝点击