序列操作(线段树,模板)

来源:互联网 发布:西科软件 知乎 编辑:程序博客网 时间:2024/06/05 07:45

n个数,m次操作
若a==1,求区间b-c最大值
若a==2,将a[ b ]改为c

#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>#define MAXN 200000 using namespace std;int a[MAXN+5],st[MAXN*4+5]; void bulid(int o,int l,int r){    if(l==r)     st[o]=a[l];    else    {        int m=l+((r-l)>>1);        bulid((o<<1),l,m);        bulid((o<<1)|1,m+1,r);        st[o]=max(st[o<<1],st[(o<<1)|1]);    }}void exch(int o,int l,int r,int ind,int ans){    if(l==r)    {      st[o]=ans;      return;     }    else    {        int m=l+((r-l)>>1);        if(ind<=m)        {            exch((o<<1),l,m,ind,ans);//|1相当于+1         }        else        {            exch((o<<1)|1,m+1,r,ind,ans);        }       }    st[o]=max(st[o<<1],st[(o<<1)|1]);}int sear(int o,int l,int r,int ql,int qr){    if(qr<l||ql>r)return 0;    if(qr>=r&&ql<=l)return st[o];    int m=l+((r-l)>>1);    return max(sear((o<<1),l,m,ql,qr),sear((o<<1)|1,m+1,r,ql,qr));}int main(){    int n,m;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)     scanf("%d",&a[i]);    bulid(1,1,n);    for(int i=1;i<=m;i++)    {        int a,b,c;        scanf("%d%d%d",&a,&b,&c);        if(a==1)         printf("%d\n",sear(1,1,n,b,c));        else          exch(1,1,n,b,c);    }    return 0;}
1 0
原创粉丝点击