Cod sursa(job #2603738)

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

int a[N], n, m;
int h[N];//heapul
void creare(int radacina, int st, int dr)
{
    if(st == dr)
    {
        h[radacina] = a[st];
        return;
    }
    int mij = (st + dr)/2;
    creare(2 * radacina, st, mij);
    creare(2 * radacina + 1, mij + 1, dr);

    h[radacina] = h[2 * radacina] + h[2 * radacina + 1];
    //cout << radacina << "  " << h[radacina] <<"\n";
}

int afisare(int radacina, int st, int dr, int x, int y)
{
    if(x <= st && y >= dr)return h[radacina];
    int mij = (st + dr) / 2;
    if(y <= mij)return afisare(2 * radacina, st, mij, x, y);
    if(x > mij)return afisare(2 * radacina + 1, mij + 1, dr, x, y);

    return afisare(2 * radacina, st, mij, x, mij) + afisare(2 * radacina + 1, mij + 1, dr, mij + 1, dr);
}

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

    h[radacina] = h[2 * radacina] + h[2 * radacina + 1];

}

int main()
{
    int i, task, x, y;
    fin >> n >> m;
    for(i = 1; i <= n; ++i)
        fin >> a[i];
    creare(1, 1, n);
    for(i = 1; i <= m; ++i)
    {
        fin >> task >> x >> y;
        if(task == 1)
            fout << afisare(1, 1, n, x, y) << "\n";
        else
            schimba(1, 1, n, x, y);
    }

    return 0;
}