Cod sursa(job #2904387)

Utilizator AncaGAncuta Gava AncaG Data 17 mai 2022 23:28:46
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream finput ("datorii.in");
ofstream foutput("datorii.out");

// se asemana tare mult cu probl arb_int
int arb_int[50100], valori[10005];

void arbore_compunere(int nod , int left, int right) {
    if (left == right)
        arb_int[nod] = valori[left];
    else {//completam arborele pe partea stanga atunci cand nu sunt pe cazul de capete egale// moment in care am epuizat cazurile pe acel nod
        int mij = (left + right) >> 1;
        arbore_compunere((nod << 1), left, mij);
        arbore_compunere(-(~(nod << 1)), mij + 1, right);
//        -(~(nod<<1)) = n/2 +1
        arb_int[nod] = arb_int[nod<<1]+arb_int[(nod<<1)+1];
    }
}

void update(int nod, int left, int right, int i, int suma)
{
    if(i < left || i > right)
        return;
    if(left == right)
    {
        arb_int[nod] -= suma;
        return;
    }
    int mij = (left+right)>>1;
    if(i <= mij)
        update(nod<<1, left, mij, i, suma);
    else
        update(((nod<<1) + 1), mij + 1, right, i, suma);
    arb_int[nod] = arb_int[nod<<1] + arb_int[(nod<<1) +1];
}

int query(int nod, int left, int right, int i, int j)
{
    if(right < i || left > j)
        return 0;
    if(i <= left && j >= right)
        return arb_int[nod];
    int mij = (left+right)>>1;
    // acumulez aici sumele restante
    return query(nod<<1, left, mij, i, j) + query((nod<<1) + 1, mij+1, right, i, j);
}

int main()
{
    int n, m, i, op, x, pos;
    finput>>n>>m;
    for(i = 1; i <= n; ++i)
        finput>>valori[i];
    arbore_compunere(1, 1, n);

    // atata timp cat are sens sa fac o operatie, deci ea exista
    while(m)
    {
        finput>>op>>pos>>x;
        //Un cod 0 urmat de doua numere intregi T, V (1 ≤ T ≤ N, 1 ≤ V ≤ 1000)
        // reprezinta o operatie de tip A (in momentul respectiv s-a achitat o valoare V
        // din suma restanta a zilei T)
        if(op == 0)
            update(1, 1, n, pos, x);

        //Un cod 1 urmat de doua numere intregi P, Q (1 ≤ P ≤ Q ≤ N)
        // o operatie de tip B (se cere suma tuturor sumelor restante din zilele P, P+1, P+2... Q
        // in momentul respectiv).
        if(op == 1)
            foutput<<query(1, 1, n, pos, x)<<'\n';
        --m;
    }
    return 0;

}