Cod sursa(job #2513395)

Utilizator hunting_dogIrimia Alex hunting_dog Data 22 decembrie 2019 23:33:28
Problema Datorii Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>

#define NMAX 15000

using namespace std;

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

struct arb
{
    int info;
    arb *stg=NULL,*dr=NULL;
};

int buildArb(arb *&a,int s,int d,int *v)
{
    a=new arb;
    if(s==d)
    {
        a->info=v[s];
        return v[s];
    }
    int m=(s+d)/2;

    a->info=buildArb(a->stg,s,m,v)+buildArb(a->dr,m+1,d,v);
    return a->info;
}

int getSum(arb *&a,int x,int y,int s,int d)
{
    if(s>y || d<x)
        return 0;
    if(s>=x && d<=y)
        return a->info;
    int m=(s+d)/2;
    return getSum(a->stg,x,y,s,m)+getSum(a->dr,x,y,m+1,d);

}

int updateVal(arb *&a,int i,int x,int s,int d)
{
    if(s==d && s==i)
    {
        a->info-=x;
        return a->info;
    }
    if(s>i || d<i)
            return a->info;
    int m=(s+d)/2;
    a->info=updateVal(a->stg,i,x,s,m)+updateVal(a->dr,i,x,m+1,d);
    return a->info;
}

int main()
{
    int n,m,v[NMAX],q,x,y;;
    fin>>n>>m;
    for(int i=0;i<n;++i)
        fin>>v[i];

    arb *a=NULL;
    buildArb(a,0,n-1,v);
    while(m--)
    {
        fin>>q>>x>>y;
        if(q==1)
            {
                fout<<getSum(a,x-1,y-1,0,n-1)<<'\n';
                continue;
            }
        updateVal(a,x-1,y,0,n-1);
    }
}