HDU

来源:互联网 发布:怎么通过网络挣钱 编辑:程序博客网 时间:2024/06/06 02:24

题目链接:https://vjudge.net/problem/HDU-1754

题意略,详见上题目链接。

分析:区间修改与查询的题目,线段树求解,单点替换,区间最值。

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cmath>#define L(u) (u<<1)#define R(u) (u<<1|1)using namespace std;const int maxn=200005;int a[maxn];int ans;struct Node{    int l,r;    int _max;}node[maxn<<2];void Pushup(int u){    node[u]._max=max(node[L(u)]._max,node[R(u)]._max);    return;}void Build(int u,int left,int right){    node[u].l=left;    node[u].r=right;    if(left==right){        node[u]._max=a[left];        return;    }    int mid=(left+right)>>1;    Build(L(u),left,mid);    Build(R(u),mid+1,right);    Pushup(u);}void Update(int u,int ID,int score){    if(node[u].l==node[u].r){        node[u]._max=score;        return;    }    int mid=(node[u].l+node[u].r)>>1;    if(mid>=ID) Update(L(u),ID,score);    else Update(R(u),ID,score);    Pushup(u);}void Quary(int u,int left,int right){    if(left==node[u].l&&node[u].r==right) {        ans=max(ans,node[u]._max);        return;    }    int mid=(node[u].l+node[u].r)>>1;    if(mid>=right) Quary(L(u),left,right);    else if(mid<left) Quary(R(u),left,right);    else {        Quary(L(u),left,mid);        Quary(R(u),mid+1,right);    }    return;}int main() {    //freopen("in.txt", "r", stdin);    int n,m;    while(~scanf("%d%d",&n,&m)){        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        Build(1,1,n);        char c;        int x,y;        while(m--){            ans=0;            scanf(" %c%d%d",&c,&x,&y);            if(c=='U') Update(1,x,y);            else{                Quary(1,x,y);                printf("%d\n",ans);            }        }    }    return 0;}