HDU1754-I Hate It

来源:互联网 发布:淘宝网折叠沙发床单人 编辑:程序博客网 时间:2024/05/22 15:10

【题目】:HDU1754

【题意】:给出初始学生的成绩,然后有2个操作,一个操作是修改成绩, 一个操作是查询区间最大值。

【题解】:用维护区间最大值的方法进行更新。max【rt】=max(max【rt<<1】,max【rt<<1|1】);

【代码】:

#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1const int maxn=222222;int MAX[maxn<<2];void pushup(int rt){    MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);}void Build(int l,int r,int rt){    if(l==r){        scanf("%d",&MAX[rt]);        return ;    }    int mid=(l+r)>>1;    Build(lson);    Build(rson);    pushup(rt);}void update(int p,int q,int l,int r,int rt){    if(l==r){        MAX[rt]=q;        return ;    }    int mid=(l+r)>>1;    if(p<=mid)update(p,q,lson);    else update(p,q,rson);    pushup(rt);}int query(int L,int R,int l,int r,int rt){    if(L<=l&&r<=R){        return MAX[rt];    }    int mid=(l+r)/2;    int ret=0;    if(L<=mid)ret=max(ret,query(L,R,lson));    if(R>mid)ret=max(ret,query(L,R,rson));    return ret;}int main(){    int n,m;    while(scanf("%d %d",&n,&m)!=EOF){        Build(1,n,1);        for(int i=0;i<m;i++){            char op[2];            cin>>op;            if(op[0]=='Q'){                int a,b;                cin>>a>>b;                cout<<query(a,b,1,n,1)<<endl;            }            else{                int a,b;                cin>>a>>b;                update(a,b,1,n,1);            }        }    }    return 0;}

0 0