Cod sursa(job #2603431)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 19 aprilie 2020 20:09:06
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <iostream>
#include<fstream>
# define N 15005
#include<algorithm>
#include<iomanip>
using namespace std;
ifstream fin("a.in");
ofstream fout("a.out");

int n, m, a[N];

///arbori de intervale
///in nodul pt intervalul (x,y) --> retinem suma tuturor datoriilor


struct nod
{
    int info;
    nod* urm1;
    nod* urm2;
};
nod* radacina;

void creare(nod* radacina, int st, int dr)
{
    if(st == dr)
    {
        radacina -> info = a[st];
        return;
    }
    int mij = (st + dr)/2;
    radacina -> urm1 = new nod;
    radacina -> urm2 = new nod;

    creare(radacina ->urm1 , st, mij);
    creare(radacina ->urm2 , mij + 1, dr);

    radacina -> info = radacina -> urm1 -> info + radacina -> urm2 -> info;
}


int raspuns(nod* radacina, int st, int dr, int x, int y)
{
    if(x <= st && y >= dr)
        return radacina -> info;


    int mij = (st + dr) / 2;
    if(y <= mij)
        return raspuns(radacina -> urm1, st, mij, x, y);
    if(x > mij)
        return raspuns(radacina -> urm2, mij + 1, dr, x, y);

    return raspuns(radacina -> urm1, st, mij, x, mij) + raspuns(radacina -> urm2, mij + 1, dr, mij + 1, y);

}

void schimba(nod* radacina ,int st, int dr, int x, int y)
{
    if(st == dr)
    {
        a[x] -= y;
        radacina -> info = a[x];
        return;
    }
    int mij = (st + dr) / 2;
    if(x <= mij)
        schimba(radacina -> urm1, st, mij, x, y);
    else if(x > mij)
        schimba(radacina -> urm2, mij + 1, dr, x, y);

    radacina -> info =radacina -> urm1 -> info + radacina -> urm2 -> info;


}

/*
struct nod
{
    int info;
    nod *urm1;
    nod *urm2;
};

nod *radacina;//radacina arborelui


void creare(nod *radacina, int st, int dr)
{
    if(st == dr)
    {
        radacina -> info = a[st];
        return;
    }

    int mij = (st + dr)/2;
    ///alocam memorie
    radacina->urm1 = new nod;
    radacina->urm2 = new nod;

    creare(radacina->urm1, st, mij);
    creare(radacina->urm2, mij + 1, dr);

    radacina ->info = radacina->urm1->info + radacina->urm2->info;
}

int raspuns(nod* radacina, int st, int dr, int x, int y)
{
    if(x <= st && y >= dr)
        return radacina->info;
    int mij = (st + dr) / 2;
    if(y <= mij)return raspuns(radacina ->urm1, st, mij, x, y);//jum stanga a intervalului
    if(x > mij)return raspuns(radacina ->urm2, mij + 1, dr, x, y);//jum dr
    return raspuns(radacina ->urm1, st, mij, x, mij) + raspuns(radacina->urm2, mij + 1, dr, mij + 1, y);
}

void schimba(nod* radacina, int st, int dr, int x, int y)
{
    if(st == dr)
    {
        a[x] -= y;
        radacina -> info = a[x];
        return;
    }

    int mij = (st + mij)/2;
    if(x <= mij)
        schimba(radacina ->urm1, st, mij, x, y);
    else if(x > mij)
        schimba(radacina ->urm2, mij + 1, dr, x, y);
    radacina -> info = radacina ->urm1 ->info + radacina ->urm2 ->info;
}
*/

int main()
{

    int i, task, x, y;
    fin >> n >> m;
    for(i = 1; i <= n; ++i)
        fin >> a[i];

    ///alocam memorie

    radacina = new nod;
    creare(radacina, 1, n);
    for(i = 1; i <= m; ++i)
    {
        fin >> task >> x >> y;
        if(task == 1)
            fout << raspuns(radacina, 1, n, x, y) << "\n";
        else schimba(radacina, 1, n, x, y);
    }

    return 0;
}