Cod sursa(job #2513507)

Utilizator hunting_dogIrimia Alex hunting_dog Data 23 decembrie 2019 11:31:42
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <fstream>

#define NMAX 15000

using namespace std;

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

int buildArb(int *a,int s,int d,int k,int *v)
{
    if(s==d)
    {
        a[k]=v[s];
        return a[k];
    }
    int m=(s+d)/2;

    a[k]=buildArb(a,s,m,2*k,v)+buildArb(a,m+1,2*k+1,d,v);
    return a[k];
}

int getSum(int *a,int x,int y,int k,int s,int d)
{
    if(s>y || d<x)
        return 0;
    if(s>=x && d<=y)
        return a[k];
    int m=(s+d)/2;
    return getSum(a,x,y,2*k,s,m)+getSum(a,x,y,2*k+1,m+1,d);

}

int updateVal(int *a,int i,int x,int k,int s,int d)
{
    if(s==d && s==i)
    {
        a[k]-=x;
        return a[k];
    }
    if(s>i || d<i)
            return a[k];
    int m=(s+d)/2;
    a[k]=updateVal(a,i,x,2*k,s,m)+updateVal(a,i,x,2*k+1,m+1,d);
    return a[k];
}

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

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