线段树模板

来源:互联网 发布:删除表数据 truncate 编辑:程序博客网 时间:2024/06/06 17:43
//单点替换
#include <iostream>#include <cstdio>using namespace std;const int maxn = 100005;int  big[maxn*4];void build(int l,int r,int rt){    if(l == r)    {        scanf("%d",&big[rt]);        return ;    }    int mid = (l+r)>>1;    build(l,mid,rt*2);    build(mid+1,r,rt*2+1);    big[rt] = max(big[rt*2],big[rt*2+1]);}void update(int p,int v,int l,int r,int rt){    if(l==r)    {        big[rt] = v;        return;    }    int mid = (l+r)>>1;    if(p<=mid) update(p,v,l,mid,rt*2);    else update(p,v,mid+1,r,rt*2+1);    big[rt]=max(big[rt*2],big[rt*2+1]);}int query(int b,int e,int l,int r,int rt){    if(b > r || e < l)        return -1;    if(b <= l && r<=e)    {        return big[rt];    }    int mid = (l+r)>>1;    int ans = 0;    if(b <= mid) ans = max(ans,query(b,e,l,mid,rt*2));    if(e > mid) ans = max(ans,query(b,e,mid+1,r,rt*2+1));    return ans;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        build(1,n,1);        while(m--)        {            int a,b,e;            scanf("%d%d%d",&a,&b,&e);            if(a)                update(b,e,1,n,1);            else                printf("%d\n",query(b,e,1,n,1));        }    }    return 0;}
//区间更新

                                             
0 0
原创粉丝点击