首页 > 代码库 > HDU 1754 I Hate It

HDU 1754 I Hate It

题解:线段树单点更新区间求极值。

#include <cstdio>#include <algorithm>using namespace std;int a,b,q[200005],t[1200000];void build(int l,int r,int x){    int mid=(l+r)>>1;    if(l==r){t[x]=q[mid];return;}    build(l,mid,x<<1);    build(mid+1,r,x<<1|1);    t[x]=max(t[x<<1],t[x<<1|1]);}int query(int l,int r,int x){    if(a<=l&&b>=r)return t[x];    else{        int mid=(l+r)>>1;        if(b<=mid)return query(l,mid,x<<1);        else if(a>mid)return query(mid+1,r,x<<1|1);        else return max(query(l,mid,x<<1),query(mid+1,r,x<<1|1));    }}void modify(int l,int r,int x){    if(l==r){t[x]=b;return;}    int mid=(l+r)>>1;    if(a<=mid)modify(l,mid,x<<1),t[x]=max(t[x<<1],t[x<<1|1]);    else{modify(mid+1,r,x<<1|1),t[x]=max(t[x<<1],t[x<<1|1]);}}int main(){    int m,n; char op[3];    while(~scanf("%d%d",&n,&m)){        for(int i=1;i<=n;i++)scanf("%d",&q[i]);        build(1,n,1);        while(m--){            scanf("%s%d%d",&op,&a,&b);            if(op[0]==‘Q‘)printf("%d\n",query(1,n,1));            else modify(1,n,1);        }    }    return 0;}