Cod sursa(job #2659098)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 15 octombrie 2020 20:11:43
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <iostream>

using namespace std;

const int NMAX = 15000;
int v[1 + NMAX];
int aint[3 * NMAX];

int qSt, qDr, zi, val;

void build(int index, int st, int dr)
{
    if (st == dr)
    {
        aint[index] = v[st];
        return;
    }

    int mij = (st + dr) / 2;
    int fiu_st = 2 * index;
    int fiu_dr = 2 * index + 1;

    build(fiu_st, st, mij);
    build(fiu_dr, mij + 1, dr);

    aint[index] = aint[fiu_st] + aint[fiu_dr];

    //cout << "Suma intre " << st << " si " << dr << "este: " << aint[index] << '\n';

    return;
}

int query(int index, int st, int dr)
{
    if (st == dr)
    {
        return aint[index];
    }

    int fiu_st = 2 * index;
    int fiu_dr = 2 * index + 1;
    int mij = (st + dr) / 2;

    if (qSt <= mij && qDr > mij)
    {
        return query(fiu_st, st, mij) + query(fiu_dr, mij + 1, dr);
    }
    else if (qSt > mij)
    {
        return query(fiu_dr, mij + 1, dr);
    }
    else
    {
        return query(fiu_st, st, mij);
    }
}

void update(int index, int st, int dr)
{
    if (st == dr)
    {
        aint[index] -= val;
        return;
    }

    int mij = (st + dr) / 2;

    if (zi > mij)
    {
        int fiu_dr = 2 * index + 1;
        update(fiu_dr, mij + 1, dr);
    }
    else
    {
        int fiu_st = 2 * index;
        update(fiu_st, st, mij);
    }

    aint[index] -= val;

    return;
}

int main()
{
    ifstream in("datorii.in");
    ofstream out("datorii.out");
    int n, m;
    int cod;

    in >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        in >> v[i];
    }

    build(1, 1, n);

    for (int i = 1; i <= m; i++)
    {
        in >> cod;

        switch (cod)
        {
        case 1:
            in >> qSt >> qDr;
            out << query(1, 1, n) << '\n';
            break;
        case 0:
            in >> zi >> val;
            update(1, 1, n);
        }
    }


    return 0;
}