Cod sursa(job #2074017)

Utilizator CammieCamelia Lazar Cammie Data 23 noiembrie 2017 23:17:51
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>

#define MAXN 100005

using namespace std;

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

int sum[MAXN], n, m;

inline void Update(int poz, int val) {
    for (int i = poz; i <= n; i += i & (-i)) {
        sum[i] += val;
    }
}

inline int Query(int a, int b) {
    int s = 0;
    for (int i = a - 1; i; i -= (i & (-i))) {
        s -= sum[i];
    }

    for (int i = b; i; i -= (i & (-i)))
        s += sum[i];

    return s;
}

inline void BinarySearch(int k) {
    int ii = 0, step, poz = MAXN, aux;

    for (step = 1; step <= n; step <<= 1);

    for (ii = 0; step; step >>= 1) {
        if (ii + step <= n) {
            aux = Query(1, ii + step);

            if (aux < k)
                ii += step;
            else if (aux == k) {
                if (ii + step < poz)
                    poz = ii + step;
            }
        }
    }

    if (poz != MAXN)
        fout << poz << "\n";
    else
        fout << "-1\n";
}

inline void Read() {
    int tip, a, b, val;

    fin >> n >> m;

    for (int i = 1; i <= n; i++) {
        fin >> val;

        Update(i, val);
    }

    for (int i = 1; i <= m; i++) {
        fin >> tip;

        if (tip == 0) {
            fin >> a >> b;
            Update(a, b);
        }
        else if (tip == 1) {
            fin >> a >> b;

            fout << Query(a, b) << "\n";
        }
        else {
            fin >> a;
            BinarySearch(a);
        }
    }
}

int main () {
    Read();

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