hdu 1754 I Hate It (单点修改+区间最值+裸题)

来源:互联网 发布:嵌入式linux书 编辑:程序博客网 时间:2024/05/18 23:25

Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 77423 Accepted Submission(s): 29789

Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0

#include <cstdio>#include <iostream>#include <cmath>using namespace std;const int maxn=200000+100;int sum[maxn<<2];void pushup(int rt) {     sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);}void build(int l,int r,int rt) {    if(l==r) {        scanf("%d",&sum[rt]);        return ;    }    int m=(l+r)>>1;    build(l,m,rt<<1);    build(m+1,r,rt<<1|1);    pushup(rt);}void update(int p,int c,int l,int r,int rt) {    if(l==r) {        sum[rt]=c;        return;    }    int m=(l+r)>>1;    if(p<=m) update(p,c,l,m,rt<<1);    else update(p,c,m+1,r,rt<<1|1);    pushup(rt);}int query(int L,int R,int l,int r,int rt) {    if(L<=l&&r<=R) {        return sum[rt];    }    int m=(l+r)>>1;    int ans=0;    if(L<=m) ans=max(ans,query(L,R,l,m,rt<<1));    if(R>m) ans=max(ans,query(L,R,m+1,r,rt<<1|1));    return ans;}int main() {//  freopen("input.txt","r",stdin);    int n,m;    while(scanf("%d%d",&n,&m)!=EOF) {        build(1,n,1);        char s;        int a,b;        while(m--) {            getchar();            scanf("%c",&s);            scanf("%d%d",&a,&b);            if(s=='Q')                printf("%d\n",query(a,b,1,n,1));            else update(a,b,1,n,1);        }    }    return 0;}
阅读全文
0 0
原创粉丝点击