线段树入门单节点更新区间求最大值hdu1754

来源:互联网 发布:云计算项目 编辑:程序博客网 时间:2024/05/22 06:33
#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<cstdio>#include<string>#include<set>#include<map>#include<queue>#include<vector>#include<stack>using namespace std;#define LL long long#define cl(a,b) memset(a,b,sizeof(a))#define N 50005#define MAXN 1001#define eps 10e-6#define lson i<<1,l,mid#define rson i<<1|1,mid+1,rint a[4000001];void push_up(int i){    a[i]=max(a[i<<1],a[(i<<1)|1]);}void build(int i,int l,int r){    if(l==r)    {        scanf("%d",&a[i]);        return;    }    int mid=(l+r)>>1;    build(lson);    build(rson);    push_up(i);}void update(int c,int b,int i,int l,int r){    if(l==r)    {        a[i]=b;        return;    }    int mid=(l+r)>>1;    if(c<=mid)update(c,b,lson);    if(c>mid)update(c,b,rson);    push_up(i);}int query(int i,int l,int r,int L,int R){    if(L<=l&&R>=r)return a[i];    int ans=0;    int mid=(l+r)>>1;    if(L<=mid)ans=max(ans,query(lson,L,R));    if(R>mid) ans=max(ans,query(rson,L,R));    return ans;}int main(){    int n,m,a,b;    char c;    while(~scanf("%d%d",&n,&m))    {        build(1,1,n);        for(int i=0;i<m;i++)        {            scanf("%*c%c%d %d",&c,&a,&b);            if(c=='Q')                printf("%d\n",query(1,1,n,a,b));            else            if(c=='U')                update(a,b,1,1,n);        }    }    return 0;}

0 0
原创粉丝点击