Cod sursa(job #2179225)

Utilizator tudortarniceruTudor Tarniceru tudortarniceru Data 20 martie 2018 00:48:56
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.54 kb
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;

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

const int MAXN = 131078;
int n, q;
int v[MAXN * 2];
int a[MAXN];

inline int parent(int nod) {
    return nod / 2;
}

inline int leftChild(int nod) {
    return nod * 2;
}

inline int rightChild(int nod) {
    return nod * 2 + 1;
}

inline void calculate(int nod) {
    v[nod] = v[leftChild(nod)] + v[rightChild(nod)];
}

void build(int nod, int st, int dr) {
    if (st == dr) {
        v[nod] = a[st];
    }
    else {
        int mid = (st + dr) / 2;
        build(leftChild(nod), st, mid);
        build(rightChild(nod), mid + 1, dr);
        calculate(nod);
    }
}

void update(int nod, int st, int dr, int poz, int val) {
    if (st == dr) {
        v[nod] += val;
    }
    else {
        int mid = (st + dr) / 2;
        if (poz <= mid) {
            update(leftChild(nod), st, mid, poz, val);
        }
        else {
            update(rightChild(nod), mid + 1, dr, poz, val);
        }
        calculate(nod);
    }
}

int sum(int nod, int st, int dr, int x, int y) {
    if (x <= st && dr <= y) {
        return v[nod];
    }
    else {
        int mid = (st + dr) / 2;
        int s = 0;
        if (x <= mid) {
            s += sum(leftChild(nod), st, mid, x, y);
        }
        if (y >= mid + 1) {
            s += sum(rightChild(nod), mid + 1, dr, x, y);
        }
        return s;
    }
}

int sum2(int nod, int st, int dr, int s) {
    if (st == dr) {
        return st;
    }
    else {
        int mid = (st + dr) / 2;
        if (s <= v[leftChild(nod)]) {
            return sum2(leftChild(nod), st, mid, s);
        }
        else {
            s -= v[leftChild(nod)];
            return sum2(rightChild(nod), mid + 1, dr, s);
        }
        return -1;
    }
}

inline void afis() {
    for (int i = 1; i <= 2 * n - 1; ++i) {
        fout << v[i] << ' ';
    }
    fout << '\n';
}

int main() {

    fin >> n >> q;
    for (int i = 1; i <= n; ++i) {
        fin >> a[i];
    }
    build(1, 1, n);
    for (int i = 1; i <= q; ++i) {
        int t, a, b;
        fin >> t;
        if (t == 0) {
            fin >> a >> b;
            update(1, 1, n, a, b);
        }
        else if (t == 1) {
            fin >> a >> b;
            fout << sum(1, 1, n, a, b) << '\n';
        }
        else {
            fin >> a;
            fout << sum2(1, 1, n, a) << '\n';
        }
    }


    fout.close();
    return 0;
}