Cod sursa(job #2624497)

Utilizator SahisttulArsene Marinel Sahisttul Data 4 iunie 2020 22:05:03
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");

int arb[4 * 15001];

void Actualizare(int nod, int  st, int dr, int poz, int val)
{
    if(st == dr)
    {
        arb[nod] += val;
        return;
    }
    int m = (st + dr)/2;
    if(poz <= m)
        Actualizare(2 * nod, st, m, poz, val);
    else
        Actualizare(2 * nod + 1, m + 1, dr, poz, val);
    arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
}

int Interogare(int nod, int st, int dr, int a, int b)
{
    if(a <= st && dr <= b)
        return arb[nod];

    int m = (st + dr)/2;
    int Q1 = 0, Q2 = 0;
    if(a <= m)
        Q1 = Interogare(2 * nod, st, m, a, b);
    if(b > m)
        Q2 = Interogare(2 * nod + 1, m + 1, dr, a, b);
    return Q1 + Q2;
}

int main()
{
    int N, M;
    f >> N >> M;
    for(int i = 1; i <= N; i++)
    {
        int x;
        f >> x;
        Actualizare(1, 1, N, i, -x);
    }
    for(int i = 1; i <= M; i++)
    {
        int op, a, b;
        f >> op >> a >> b;
        if(op == 1)
            g << -Interogare(1, 1, N, a, b) << '\n';
        else if(op == 0)
            Actualizare(1, 1, N, a, b);
    }
    return 0;
}