Cod sursa(job #2903576)

Utilizator razvan1234Danciu Razvan razvan1234 Data 17 mai 2022 18:26:10
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin ("datorii.in");
ofstream fout ("datorii.out");

int arb_int[4000001];
void facere(int nod, int st, int dr, int poz, int val)
{
    if (poz < st or poz > dr) return;
    if (st == dr){
        arb_int[nod] = val;
        return;
    }

    int mjl = (st + dr) / 2;
    facere(2*nod, st, mjl, poz, val);
    facere(2*nod+1, mjl+1, dr, poz, val);

    arb_int[nod] = arb_int[2*nod] + arb_int[2*nod+1];
}

int sum_q(int nod, int st, int dr, int q_st, int q_dr)
{
    if (q_st > dr or q_dr < st) return 0;
    if (st >= q_st and dr <= q_dr) return arb_int[nod];

    int mjl = (st + dr) / 2;
    return sum_q(2*nod, st, mjl, q_st, q_dr) + sum_q(2*nod+1, mjl+1, dr, q_st, q_dr);
}

void change(int nod, int st, int dr, int poz, int val)
{
    if (poz < st or poz > dr) return;
    if (st == dr){
        arb_int[nod] -= val;
        return;
    }

    int mjl = (st + dr) / 2;
    change(2*nod, st, mjl, poz, val);
    change(2*nod+1, mjl+1, dr, poz, val);

    arb_int[nod] = arb_int[2*nod] + arb_int[2*nod+1];

}
int main()
{
    int n, m;
    fin>>n>>m;
    for (int i = 1; i <= n; i++){
        int a;
        fin>>a;
        facere(1, 1, n, i, a);
    }

    for (int i = 1; i <= m; i++){
        int op, aux, bux;
        fin>>op>>aux>>bux;
        if (op == 1) fout<<sum_q(1, 1, n, aux, bux)<<"\n";
        else change(1, 1, n, aux, bux);

    }
    return 0;
}