zoukankan      html  css  js  c++  java
  • 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;
          }
    }
  • 相关阅读:
    OO第三单元总结
    oo第二单元总结
    oo第一单元总结
    OO助教工作总结
    当QSY遇上XL尺码的小黄衫
    终点亦是起点
    敏捷开发规范化
    Beta阶段性总结
    需求存在,功能存在——Alpha阶段性总结
    Gitlab Burndown Chart
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5352859.html
Copyright © 2011-2022 走看看