Cod sursa(job #1620524)

Utilizator blackoddAxinie Razvan blackodd Data 29 februarie 2016 10:31:03
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>

using namespace std;

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

#define MaxN 15001

int n, m;
int val, poz, type, a, b, s;
int arb[4 * MaxN];

void Update(int, int, int, int);
void Query(int, int, int);

int main() {

    fin >> n >> m;

    for ( int i = 1; i <= n; ++i ) {
        fin >> val;
        poz = i;
        Update(1, 1, n, 1);
    }

    for ( int i = 1; i <= m; ++i ) {
        fin >> type >> a >> b;
        if ( type == 0 ) {
            poz = a, val = b;
            Update(1, 1, n, -1);
        }
        else {
            s = 0;
            Query(1, 1, n);
            fout << s << '\n';
        }
    }

    fin.close();
    fout.close();
    return 0;
}

void Query(int nod, int st, int dr) {
    if ( a <= st && dr <= b ) {
        s += arb[nod];
        return;
    }
    int mij = (st + dr) / 2;
    if ( a <= mij )
        Query(2 * nod, 1, mij);
    if ( mij < b )
        Query(2 * nod + 1, mij + 1, dr);
}

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

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