HDU 1754 I Hate It(线段树-区间求最值&&单点修改)

来源:互联网 发布:摇钱树计费软件 编辑:程序博客网 时间:2024/05/17 01:10

线段树基础题,区间最值,单点修改

细节参见代码:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))using namespace std;typedef long long ll;const double PI = acos(-1.0);const double eps = 1e-6;const int INF = 1000000000;const int maxn = 300000+10;int T,n,A,B,m,maxv[maxn<<1];void push_up(int o) {    maxv[o] = max(maxv[o<<1],maxv[o<<1|1]);}void build(int l, int r, int o) {    int m = (l + r) >> 1;    if(l == r) {        scanf("%d",&maxv[o]);  return ;    }    build(l, m, o<<1);    build(m+1, r, o<<1|1);    push_up(o);}void update(int p, int v, int l, int r, int o) {    int m = (l + r) >> 1;    if(l == r) {        maxv[o] = v; return ;    }    if(p <= m) update(p, v, l, m, o<<1);    else update(p, v, m+1, r, o<<1|1);    push_up(o);}int query(int L, int R, int l, int r, int o) {    int m = (l + r) >> 1, ans = -INF;    if(L <= l && r <= R) {        return maxv[o];    }    if(m >= L) ans = max(ans, query(L, R, l, m, o<<1));    if(m+1 <= R) ans = max(ans, query(L, R, m+1, r, o<<1|1));    return ans;}char s[10];int main() {    while(~scanf("%d%d",&n,&m)) {        build(1,n,1);        while(m--) {            scanf("%s%d%d",s,&A,&B);            if(s[0] == 'Q') printf("%d\n",query(A,B,1,n,1));            else update(A,B,1,n,1);        }    }    return 0;}


0 0
原创粉丝点击