Cod sursa(job #2073989)

Utilizator CammieCamelia Lazar Cammie Data 23 noiembrie 2017 22:31:23
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 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;

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

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

    if (Query(1, ii) == k)
        fout << ii << "\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;
}