HDU 1754 I Hate It

本题是一个简单的线段树 与hdu的1166题相似

树状数组模拟线段树 进行节点的更新与查询  


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
int a[5005000];
int sum;
void updat(int id,int l,int r,int mid,int pos){
    if(l==r){
        a[mid]=pos;
        return;
    }
    int i=(l+r)>>1;
    if(id<=i)updat(id,l,i,2*mid,pos);
    else updat(id,i+1,r,2*mid+1,pos);
    a[mid]=max(a[2*mid],a[2*mid+1]);
}
void su(int l,int r,int mid,int ll,int rr){
    if(l>=ll&&r<=rr){
        sum=max(sum,a[mid]);
        return;
    }
    int i=(l+r)>>1;
    if(ll<=i)su(l,i,2*mid,ll,rr);
    if(rr>i)su(i+1,r,2*mid+1,ll,rr);
}
int main()
{
    int n,m,pos,x1,x2;
    while(scanf("%d%d",&m,&n)!=EOF){
        mem(a);
        for(int i=1; i<=m; i++){
            scanf("%d",&pos);
            updat(i,1,m,1,pos);
        }
        while(n--){
            char c[5];
            scanf("%s",c);//采用字符串 字符的话要吃回车
            if(!strcmp(c,"Q")){
                scanf("%d%d",&x1,&x2);
                sum=0;
                su(1,m,1,x1,x2);
                printf("%d\n",sum);
            }
            if(!strcmp(c,"U")){
                scanf("%d%d",&x1,&x2);
                updat(x1,1,m,1,x2);
            }
        }
    }
    return 0;
}

你可能感兴趣的:(线段树,it)