Cod sursa(job #2669533)

Utilizator NanuGrancea Alexandru Nanu Data 7 noiembrie 2020 10:52:11
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream cin("aib.in");
ofstream cout("aib.out");

#define NMAX 100001
#define Ub(x) (x & (-x))

int v[NMAX], aib[NMAX], n, m, i, c, a, b, x;

void add(int pos, int val) {
    for(int i = pos; i <= n; i += Ub(i))
        aib[i] += val;
}

long long sum(int pos) {
    long long s = 0, i;
    for(i = pos; i >= 1; i -= Ub(i))
        s += aib[i];
    return s;
}

int cautBinar(int x) {
    int st = 1, dr = n, poz = -1;
    while(st <= dr && poz == -1) {
        int mid = (st + dr) / 2;
        int s = sum(mid);
        if(s == x)
            poz = mid;
        else if(x < s)
            dr = mid - 1;
        else st = mid + 1;
    }

    return poz;
}

int main() {
    cin >> n >> m;
    for(i = 1; i <= n; i++) {
        cin >> v[i];
        add(i, v[i]);
    }
    for(int j = 1; j <= m; j++) {
        cin >> c;
        if(c == 0) { 
            cin >> a >> b;
            add(a, b);
        }else if(c == 1) {
            cin >> a >> b;
            cout << sum(b) - sum(a - 1) << '\n';
        }else {
            cin >> x;
            cout << cautBinar(x) << '\n';
        }
    
    }

    return 0;
}