Cod sursa(job #2312344)

Utilizator alexnigaNiga Alexandru alexniga Data 4 ianuarie 2019 18:45:20
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");

void update_arb(int left, int right, int poz_arb, int poz_numar, int numar, int x[])
{
    if (left == right)
    {
        x[poz_arb] = numar;
        return;
    }
    int middle = (left + right) / 2;

    if (poz_numar <= middle)
        update_arb(left, middle, 2 * poz_arb, poz_numar, numar, x);
    else
        update_arb(middle + 1, right, 2 * poz_arb + 1, poz_numar, numar, x);

    x[poz_arb] = x[2 * poz_arb] + x[2 * poz_arb + 1];
}

void update_arb_datorii(int left, int right, int poz_arb, int poz_numar, int numar, int x[])
{
    if (left == right)
    {
        x[poz_arb] = x[poz_arb] - numar;
        return;
    }

    int middle = (left + right) / 2;

    if (poz_numar <= middle)
        update_arb_datorii(left, middle, 2 * poz_arb, poz_numar, numar, x);
    else
        update_arb_datorii(middle + 1, right, 2 * poz_arb + 1, poz_numar, numar, x);

    x[poz_arb] = x[2 * poz_arb] + x[2 * poz_arb + 1];
}

void query(int left, int right, int poz_arb, int poz_left, int poz_right, int x[], int &maxim)
{

    if (poz_left <= left && right <= poz_right)
        {
            maxim += x[poz_arb];
            return;
        }
    int middle = (left + right) / 2;
    if (poz_left <= middle)
        query(left, middle, 2 * poz_arb, poz_left, poz_right, x, maxim);
    if (poz_right > middle)
        query(middle + 1, right, 2 * poz_arb + 1, poz_left, poz_right, x, maxim);
}


int main()
{
    int n, m, i, numar, a, b, j, case_x, maxi;
    int x[150001] = {0};

    f >> n >> m;

    for (i = 1; i <= n; i++)
        {
            f >> numar;
            update_arb(1, n, 1, i, numar, x);
        }

    for (i = 1; i <= m; i++)
    {
        f >> case_x >> a >> b;

        if (case_x == 0)
            {
                update_arb_datorii(1, n, 1, a, b, x);
            }
        else
        {
            maxi = 0;
            query(1, n, 1, a, b, x, maxi);
            g << maxi << "\n";

        }
    }

    return 0;
}