Cod sursa(job #2881981)

Utilizator DMR6476Erdic Dragos DMR6476 Data 31 martie 2022 08:37:08
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <iostream>
#include<fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int theResultArray[90001];
int theArray[15001];
void doInterval(int st, int dr, int index){
    if(st == dr)
        {theResultArray[index] = theArray[st];
        return ;
        }
    int med = (st + dr) / 2;
    doInterval(st, med, index * 2 + 1);
    doInterval(med + 1, dr, index * 2 + 2);
    theResultArray[index] = theResultArray[index * 2 + 1] + theResultArray[index * 2 + 2];

}
void scadereDinInterval(int st, int dr, int wantedPos, int wantedVal, int index){
    if( st > wantedPos || dr < wantedPos)
    {
        return ;
    }
    if(st == dr && wantedPos == st){
        theResultArray[index] -= wantedVal;
        return ;
    }
    int med = (st + dr) / 2;
    scadereDinInterval(st, med, wantedPos, wantedVal, index * 2 + 1);
    scadereDinInterval(med + 1, dr, wantedPos, wantedVal, index * 2 + 2);
    theResultArray[index] = theResultArray[index * 2 + 1] + theResultArray[index * 2 + 2];
}
int getSumInInterval(int st, int dr, int wantedLeft, int wantedRight, int index)
{
    if(st > wantedRight || dr < wantedLeft)
        return 0;
    if(wantedLeft <= st && wantedRight >= dr)
        return theResultArray[index];
    int med = (st + dr) / 2;
    return getSumInInterval(st, med , wantedLeft, wantedRight, index * 2 + 1) + getSumInInterval(med + 1, dr, wantedLeft, wantedRight, index * 2 + 2);
}
int main()
{
    int n,operations;
    fin>>n>>operations;
    for(int i = 0; i < n; i++)
    {
        fin>>theArray[i];
    }
    doInterval(0,n - 1, 0);
    for(int i = 0; i < operations; i++)
    {
        int op, l, r;
        fin>>op>>l>>r;
        --l;
        if(op == 0)
        {
            // operatia de scadere
            scadereDinInterval(0, n - 1, l, r, 0);
        }
        else{
                -- r;
            fout<<getSumInInterval(0,n - 1, l, r, 0)<<"\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}