Cod sursa(job #2499495)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 26 noiembrie 2019 11:25:27
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>

#include <fstream>



using namespace std;



const int MAXN = 1e6;



ifstream fin("aib.in");

ofstream fout("aib.out");



int tree[MAXN + 10], n, m;



void add(int ind, int val) {

    for (int i = ind; i <= n; i += (i & (-i)))

        tree[i] += val;

}



int sum(int ind) {

    int s = 0;

    for (int i = ind; i >= 1; i -= (i & (-i)))

        s += tree[i];

    return s;

}



int find(int val) {

    int start, power;

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

    power >>= 1;

    for (start = 0; power; power >>= 1)

            if (tree[start + power] <= val) {

                start += power;

                val -= tree[start];

                if (!val)

                return (start);

            }


    return -1;

}



int main() {

    int p, x, y;;

    fin >> n >> m;

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

        fin >> x;

        add(i, x);

    }

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

        fin >> p;

        if (p == 0) {

            fin >> x >> y;

            add(x, y);

        }

        else if (p == 1) {

            fin >> x >> y;

            fout << sum(y) - sum(x - 1) << "\n";

        }

        else {

            fin >> x;

            fout << find(x) << "\n";

        }

    }

    return 0;

}