HDU1754[I HATE IT] 线段树

来源:互联网 发布:windows nt 4.0 sp6 编辑:程序博客网 时间:2024/06/08 10:59

题目:

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input

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

Output

对于每一次询问操作,在一行里面输出最高成绩。

Sample Input

5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5

Sample Output

5
6
5
9

题解:

线段树 单点修改 区间最值

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;#define N 200010#define ls l, m, rt<<1#define rs m+1, r, rt<<1|1int maxn[N << 2];void update( int nd ){    maxn[nd] = max( maxn[ nd << 1 ], maxn[ nd << 1 | 1 ]);}void build( int l, int r, int rt){    if ( l == r ){         scanf( "%d", &maxn[rt]);         return ;    }    int m = ( l + r ) >> 1;    build(ls);    build(rs);    update(rt);}void cdate( int p, int x, int l, int r, int rt){    if ( l == r ){         maxn[rt] = x;         return ;    }    int m = ( l + r ) >> 1;    if ( p <= m ) cdate( p, x, ls);    else cdate( p, x, rs);    update(rt);}int query( int L, int R, int l, int r, int rt){    if ( L <= l && r <= R ){        return maxn[rt];    }    int m = ( l + r ) >> 1;    int ret = 0;    if ( L <= m ) ret = max( ret, query( L, R, ls));    if ( R >m ) ret = max( ret, query( L, R, rs));    return ret; }int main(){    int n, m;    while(~scanf("%d%d",&n,&m)){        build( 1, n, 1 );        while( m-- ){            char op[2];            int a , b;            scanf( "%s%d%d", op, &a, &b);            if(op[0]=='Q')printf("%d\n",query(a, b, 1, n, 1 ) );            else cdate( a, b, 1, n, 1 );        }    }    return 0;}
原创粉丝点击