• codevs1080线段树练习


    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 100010
    #define maxm 200020
    #define maxx 10010
    using namespace std;
    int n,m,a[maxn],num;
    struct node
    {
        int lc,rc;
        int l,r;
        int sum;
    }tree[maxm];
    
    void build(int ll,int rr)
    {
        int cur=++num;
        tree[cur].l=ll;tree[cur].r=rr;
        if(ll!=rr-1)
          {
              tree[cur].lc=num+1;
              build(ll,(ll+rr)/2);
              tree[cur].rc=num+1;
              build((ll+rr)/2,rr);
              tree[cur].sum=tree[tree[cur].lc].sum+tree[tree[cur].rc].sum;
          }
        else tree[cur].sum=a[ll];
    }
    void change(int k,int x,int p)
    {
        if(tree[k].l==tree[k].r-1)tree[k].sum+=p;
        else 
          {
              if(x<(tree[k].l+tree[k].r)/2)change(tree[k].lc,x,p);
            if(x>=(tree[k].l+tree[k].r)/2)change(tree[k].rc,x,p);
            tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;
          }
    }
    int find(int k,int ll,int rr)
    {
        if(ll<=tree[k].l&&rr>=tree[k].r)return tree[k].sum;
        int ans=0;
        if(ll<(tree[k].l+tree[k].r)/2)ans+=find(tree[k].lc,ll,rr);
        if(rr>(tree[k].l+tree[k].r)/2)ans+=find(tree[k].rc,ll,rr);
        return ans;
    }
    int main()
    {
        cin>>n;
        int i,j,x,y,z;
        for(i=1;i<=n;i++)
          cin>>a[i];
        build(1,n+1);
        cin>>m;
        for(i=1;i<=m;i++)
          {
              cin>>x>>y>>z;
              if(x==1)change(1,y,z);
              if(x==2)cout<<find(1,y,z+1)<<endl;
          }
    }
  • 相关阅读:
    字体图标的制作
    vs code 本地调试配置
    瀑布流
    web组件化开发第一天
    超时调用和间歇调用
    递归 闭包
    继承
    面向对象的程序设计
    function类型
    Date类型
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5352859.html
Copyright © 2020-2023  润新知