线段树系列-hdu-1754-I Hate It-单点修改求区间最值

来源:互联网 发布:倚天屠龙记星河源码 编辑:程序博客网 时间:2024/05/19 00:13
简单的单点修改,求区间最值
#include<bits/stdc++.h>#define max_N 800000using namespace std;int ans;        //求和int big;        //求最大值struct seg{    int l,r,v,maxn;}tree[max_N];void build(int l,int r,int k) {    tree[k].l=l;    tree[k].r=r;    tree[k].v=0;    tree[k].maxn=0;    if(tree[k].l==tree[k].r) return;    int mid=(l+r)>>1;    build(l,mid,2*k);    build(mid+1,r,2*k+1);}void update(int num,int v,int k) {    if(tree[k].l==tree[k].r&&tree[k].r==num) {        tree[k].v=v;        tree[k].maxn=v;        return;    }    int mid=(tree[k].l+tree[k].r) >> 1;    if(num<=mid) {        update(num,v,k*2);    }    else {        update(num,v,k*2+1);    }    if(v>tree[k].maxn) {        tree[k].maxn=v;    }}void query(int l,int r,int k) {    if(tree[k].l==l&&tree[k].r==r) {        if(tree[k].maxn>big) {            big=tree[k].maxn;        }        return;    }    int mid=(tree[k].l+tree[k].r) >>1;    if(r<=mid) {        query(l,r,2*k);    }    else if(l>mid) {        query(l,r,2*k+1);    }    else {        query(l,mid,2*k);        query(mid+1,r,2*k+1);    }}int main(){    int n,m;    int temp;    char s[10];    int x,y;    while(scanf("%d%d",&n,&m)!=EOF) {        build(1,n,1);        for(int i=1;i<=n;i++) {           scanf("%d",&temp);           update(i,temp,1);        }        for(int i=1;i<=m;i++) {            scanf("%s%d%d",s,&x,&y);            if(s[0]=='Q') {                big=0;                query(x,y,1);                printf("%d\n",big);            }            if(s[0]=='U') {                update(x,y,1);            }        }    }    return 0;}

1 0
原创粉丝点击