Cod sursa(job #2294953)

Utilizator CezarTDTodirisca Cezar CezarTD Data 2 decembrie 2018 23:11:37
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

int v[15001],n,m,q,x,y;
const int b=32000;
struct parser{
    char *B,*E,*p;
    parser()
    {
        B=new char[b+10];
        E=B+b;
        Load();
    }
    parser &operator>>(int&x)
    {
        while(*p<'0' || *p>'9')Next();
        x=0;
        while(*p>='0' && *p<='9')
        {
            x=x*10+*p-'0';
            Next();
        }
        return *this;
    }
    void Load()
    {
        p=B;
        memset(B,0,b);
        fread(B,1,b,stdin);
    }
    void Next()
    {
        p++;
        if(p==E)Load();
    }

};

void update(int ind,int val)
{
    while(ind<=n)
    {
        v[ind]+=val;
        ind+=ind&(-ind);
    }
}

int getsum(int ind)
{
    int sum=0;
    while(ind>0)
    {
        sum+=v[ind];
        ind-=ind&(-ind);
    }
    return sum;
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    parser fin;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        update(i,x);
    }
    for(;m;m--)
    {
        fin>>q>>x>>y;
        if(q)
        {
            printf("%d\n",getsum(y)-getsum(x-1));
        }
        else{
            update(x,-y);
        }
    }
    return 0;
}