Cod sursa(job #2477649)

Utilizator Vlad.Vlad Cristian Vlad. Data 20 octombrie 2019 21:01:32
Problema Arbori indexati binar Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
long a[100010];
int highestPowerOf2(int n) {
    int pow = 1;
    while (pow <= n) {
        pow *= 2;
    }
    return pow / 2;
}
void update(int p, int v) {
    for (int i = p; i <= n; i += i & -i) {
        a[i] += v;
    }
}
long query(int p) {
    long s = 0;
    for (int i = p; i > 0; i -= i & -i) {
        s += a[i];
    }
    return s;
}
int searchK(long x, int dr) {
    int lun = dr & -dr;
    cerr << x << " " << dr << " " << a[dr] << " " << "\n";
    if (a[dr] == x) {
        return dr;
    }
    if (lun == 1) {
        return -1;
    }
    if (a[dr] > x || a[dr] == 0)
        return searchK(x, dr - lun / 2);
    return searchK(x - a[dr], dr + lun / 2);
}
void citire() {
    fin >> n >> m;
    int val;
    for (int i = 1; i <= n; ++i) {
        fin >> val;
        update(i, val);
    }
}
int main()
{
    citire();
    int c;
    long x, y;
    for (int i = 1; i <= m; ++i) {
        fin >> c >> x;
        if (c == 0) {
            fin >> y;
            update(x, y);
        }
        else if (c == 1) {
            fin >> y;
            fout << query(y) - query(x - 1) << "\n";
        }
        else {
            fout << searchK(x, highestPowerOf2(n)) << "\n";
            cerr << "\n\n";
        }
    }
    return 0;
}