hdu1754I Hate It

线段树求区间最值。

pushup操作时就赋予最大值。

查询操作就好搞了。另外,用cin会wa

#include <bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define ll long long
#define ld long double
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define lcm(a,b) ((a)*(b)/(__gcd((a),(b))))
#define Max 200005
#define mod 1000000007
using namespace std;
typedef pair<int, int> pii;
ll n, m, sum[Max << 2], f, a, b;
void pushup(ll rt) {
    sum[rt] = max(sum[rt << 1], sum[rt << 1 | 1]);
}
void build(ll l, ll r, ll rt) {
    if(l == r) {
        scanf("%d", &sum[rt]);
        return;
    }
    ll m = (r + l) >> 1;
    build(l, m, rt << 1);
    build(m + 1, r, rt << 1 | 1);
    pushup(rt);
}
void update(ll L, ll C, ll l, ll r, ll rt) {
    if(l == r) {
        sum[rt] = C;
        return ;
    }
    ll m = (l + r) >> 1;
    if(L <= m)
        update(L, C, l, m, rt << 1);
    else
        update(L, C, m + 1, r, rt << 1 | 1);
    pushup(rt);
}
ll query(ll L, ll R, ll l, ll r, ll rt) {
    if(L <= l && r <= R) {
        return sum[rt];
    }
    ll m = (r + l) >> 1;
    ll ans = -INF;
    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() {
    while(~scanf("%lld%lld", &n, &m)) {
        build(1, n, 1);
        for(int i = 0; i < m; i++) {
            char c[10];
            scanf("%s%lld%lld", &c, &a, &b);
            if(c[0] == 'U') {
                update(a, b, 1, n, 1);
            } else
                printf("%lld\n", query(a, b, 1, n, 1));
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Endeavor_G/article/details/88622595