HDU 1754 线段树单点更新求最大值

来源:互联网 发布:淘宝卖家实拍保护在哪 编辑:程序博客网 时间:2024/06/05 21:02
#include <map>#include <set>#include <list>#include <cmath>#include<cctype>#include <ctime>#include <deque>#include <stack>#include <queue>#include <cstdio>#include <string>#include <vector>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define PI 3.1415926535897932626using namespace std;int gcd(int a, int b){return a % b == 0 ? b : gcd(b, a % b);}#define MAXN 200004struct node{    int l ,r;    int Max;}tree[MAXN*4];int src[MAXN];void buildtree(int id,int l ,int r){    tree[id].l=l;tree[id].r=r;    if (l==r)    {        tree[id].Max=src[l];    }    else    {        int m=(l+r)/2;        buildtree(id*2,l,m);        buildtree(id*2+1,m+1,r);        tree[id].Max=max(tree[id*2].Max,tree[id*2+1].Max);    }}void update(int id ,int pos ,int val){    if (tree[id].l==tree[id].r && tree[id].l==pos)    {        tree[id].Max=val;    }    else    {        int m=(tree[id].l+tree[id].r)/2;        if (pos>m) update(id*2+1,pos,val);        else update(id*2,pos,val);        tree[id].Max=max(tree[id*2].Max,tree[id*2+1].Max);    }}int query(int id,int l ,int r){    if (tree[id].l==l && tree[id].r==r)    {        return tree[id].Max;    }    else    {        int m=(tree[id].l+tree[id].r)/2;        if (m>=r) return query(id*2,l,r);        else if (l>m) return query(id*2+1,l,r);        else return max(query(id*2,l,m),query(id*2+1,m+1,r));    }}int main(){    int N,M;    while (~scanf("%d%d",&N,&M))    {        for (int i=1;i<=N;i++)            scanf("%d",&src[i]);        buildtree(1,1,N);        char input[3];int a,b;        while (M--)        {            scanf("%s%d%d",input,&a,&b);            //printf("%s%d%d\n",input,a,b);            if (input[0]=='Q')                printf("%d\n",query(1,a,b));            else update(1,a,b);        }    }    return 0;}

0 0
原创粉丝点击