Cod sursa(job #1300226)

Utilizator somuBanil Ardej somu Data 24 decembrie 2014 10:41:54
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;

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

int n, m;
int S[4*nmax];

void update(int val, int poz) {
    while (poz <= n) {
        S[poz] += val;
        poz += poz^(poz-1)&poz;
    }
}

int query(int poz) {
    int s = 0;
    while (poz > 0) {
        s += S[poz];
        poz -= poz^(poz-1)&poz;
    }
    return s;
}

void findK(int val) {
    int lo = 1, hi = n, mid;
    while (lo <= hi) {
        mid = (hi + lo) >> 1;
        int l = query(mid);
        if (l == val) {
            fout << mid << "\n";
            return;
        } else if (l < val)
            lo = mid + 1;
        else
            hi = mid - 1;
    }
    cout << -1 << "\n";
}

void solve() {
    int i, op, a, b, x;
    fin >> n >> m;
    for (i = 1; i <= n; i++) {
        fin >> x;
        update(x, i);
    }
    for (i = 1; i <= m; i++) {
        fin >> op;
        if (op == 0) {
            fin >> a >> b;
            update(b, a);
        } else if (op == 1) {
            fin >> a >> b;
            fout << query(b) - query(a-1) << "\n";
        } else {
            fin >> a;
            findK(a);
        }
    }
}

int main() {
    solve();
    fin.close();
    fout.close();
    return 0;
}