zoukankan      html  css  js  c++  java
  • 序列操作(线段树,模板)

    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
    ",sear(1,1,n,b,c));
            else 
             exch(1,1,n,b,c);
        }
        return 0;
    }
  • 相关阅读:
    提问回顾
    个人阅读作业+个人总结
    结对项目-数独程序扩展
    个人作业-Week 3
    个人作业-Week 2
    个人项目-数独程序
    个人作业-Week 1
    第0次博客作业
    2017[BUAA软工]第0次个人作业
    [2017BUAA软工]提问回顾
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819792.html
Copyright © 2011-2022 走看看