hdu 1754 I Hate It 线段树-区间最值

来源:互联网 发布:英语 加油 知乎 编辑:程序博客网 时间:2024/04/29 12:44
#include<bits/stdc++.h>using namespace std;typedef int ll;const int N=200000+5;int a[N],ans;struct Tree{    int left,right;    ll maxv;}tree[4*N+10];//建立线段树,如果是数组a1-an,可以build(1,1,n)来建立void build(int id,int l,int r){    tree[id].left=l;    tree[id].right=r;    tree[id].maxv=0;    if (l==r)    {        tree[id].maxv=a[l];    }    else    {        int mid=(l+r)/2;        build(id*2,l,mid);        build(id*2+1,mid+1,r);        tree[id].maxv=max(tree[id*2].maxv,tree[id].maxv);        tree[id].maxv=max(tree[id*2+1].maxv,tree[id].maxv);    }}//单点更新,id从1开始,pos为目标位置void update(int id,int pos,ll val){    if (tree[id].left==tree[id].right)        tree[id].maxv=val;    else    {        tree[id].maxv=(val,tree[id].maxv);        int mid=(tree[id].left+tree[id].right)/2;        if (pos<=mid) update(id*2,pos,val);        else update(id*2+1,pos,val);        tree[id].maxv=max(tree[id*2].maxv,tree[id].maxv);        tree[id].maxv=max(tree[id*2+1].maxv,tree[id].maxv);    }}//查询范围内的和void query(int id,int l,int r){    if (tree[id].left==l&&tree[id].right==r)    {        ans=max(tree[id].maxv,ans);        return;    }    else    {        int mid=(tree[id].left+tree[id].right)/2;        if (r<=mid) query(id*2,l,r);        else if (l>mid) query(id*2+1,l,r);        else        {            query(id*2,l,mid);            query(id*2+1,mid+1,r);        }    }}int main(){    int i,n,m,x,y;    char cmd[20];    while(~scanf("%d%d",&n,&m))    {        memset(a,0,sizeof(a));        for(i=1;i<=n;i++)            scanf("%d",&a[i]);        build(1,1,n);        for(i=0;i<m;i++)        {            scanf("%s %d %d",cmd,&x,&y);            if(cmd[0]=='Q')            {                ans=-1;                query(1,x,y);                printf("%d\n",ans);            }            else            {                update(1,x,y);            }        }    }    return 0;}
0 0
原创粉丝点击