hdu 1754 线段树

hdu 1754 区间求最大值



#include<iostream>
#include<cstdio>
#include<algorithm>
#include<memory.h>
using namespace std;
const int maxn=200002;
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
int Max[maxn<<2],n,m,s[maxn];
char op[2];
void PushUP(int rt)
{
    Max[rt]=max(Max[rt<<1],Max[rt<<1|1]);
}
void build(int rt,int l,int r)
{
    if(l==r)
    {
        Max[rt]=s[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(lson);
    build(rson);
    PushUP(rt);
}
void update(int rt,int l,int r,int idx,int data)
{
    if(l==r)
    {
        Max[rt]=data;
        return;
    }
    int mid=(l+r)>>1;
    if(mid>=idx) update(lson,idx,data);
    else update(rson,idx,data);
    PushUP(rt);
}
int query(int rt,int l,int r,int L,int R)
{
    if(L<=l&&r<=R)
    {
        return Max[rt];
    }
    int mid=(l+r)>>1;
    int s1=0,s2=0;
    if(mid>=L) s1=query(lson,L,R);
    if(R>mid)  s2=query(rson,L,R);
    return max(s1,s2);
}
int main()
{
    int i,j,k,a,b;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1;i<=n;i++)scanf("%d",&s[i]);
        build(1,1,n);
        for(i=1;i<=m;i++)
         {
             scanf("%s%d%d",&op,&a,&b);
             if(op[0]=='Q')
             {
                 printf("%d\n",query(1,1,n,a,b));
             }
             else
             {
                 update(1,1,n,a,b);
             }
         }
    }
    return 0;
}



   

你可能感兴趣的:(hdu 1754 线段树)