POJ 1745 I HATE IT(线段树)

来源:互联网 发布:小浣熊水浒传108将淘宝 编辑:程序博客网 时间:2024/05/22 00:53

http://blog.acmj1991.com/?p=677

题意:自己看

思路:这题是区间插入最大值和求区间最大值,所以用线段树

#include<stdio.h>#include<string.h> #define maxN 200010int num,n,m,key[maxN];struct node{    int l,r,ln,rn,maxx;}po[2*maxN]; int max(int x,int y){return x>y?x:y;}int Buildtree(int l,int r){    int m=num++;    po[m].l=l,po[m].r=r;    if(l==r)return po[m].maxx=key[r];    int mid=(l+r)>>1;    po[m].ln=num;    po[m].maxx=max(po[m].maxx,Buildtree(l,mid));    po[m].rn=num;    po[m].maxx=max(po[m].maxx,Buildtree(mid+1,r));}void add(int k,int v,int st){    po[st].maxx=max(po[st].maxx,v);    if(po[st].l==k&&po[st].r==k)return ;    int mid=(po[st].l+po[st].r)>>1;    if(k<=mid)add(k,v,po[st].ln);    else add(k,v,po[st].rn);}int query(int l,int r,int st){    if(po[st].l==l&&po[st].r==r)        return po[st].maxx;    int mid=(po[st].r+po[st].l)>>1;    if(r<=mid)return query(l,r,po[st].ln);    else if(l>mid)return  query(l,r,po[st].rn);    else return max(query(l,mid,po[st].ln),query(mid+1,r,po[st].rn));} int main(){    while(~scanf("%d%d",&n,&m))    {        char str[10];        int u,v;        num=1;        memset(po,0,sizeof(po));        for(int i=1;i<=n;i++)            scanf("%d",&key[i]);        Buildtree(1,n);        while(m--){            scanf("%s%d%d",str,&u,&v);            if(str[0]=='U')                add(u,v,1);            else                printf("%d\n",query(u,v,1));        }    }}