Cod sursa(job #2513522)

Utilizator david.teacaDavid Stefan Teaca david.teaca Data 23 decembrie 2019 12:08:09
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 k,int s,int d,int *v)
{
    if(s==d)
    {
        a[k]=v[s];
        return a[k];
    }
    int m=(s+d)/2;
 
    a[k]=buildArb(a,2*k,s,m,v)+buildArb(a,2*k+1,m+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,1,0,n-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);
    }
}