Cod sursa(job #1313545)

Utilizator diana97Diana Ghinea diana97 Data 10 ianuarie 2015 19:58:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f ("aib.in");
ofstream g ("aib.out");

const int NMAX = 100000 + 1;

int n, m;
int aib[NMAX];

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

int query(int x) {
    int s = 0;
    for (int i = x; i; i -= i & (-i))
        s = s + aib[i];
    return s;
}


int cauta(int st, int dr, int val) {
    int m, sol, rez;
    while (st <= dr) {
        m = (st + dr) / 2;
        rez = query(m);
        if (rez <= val) {
            sol = rez;
            st = m + 1;
            if (sol == val) return m;
        }
        else dr = m - 1;
    }
    return -1;
}

void citeste() {
    f >> n >> m;
    int x;
    for (int i = 1; i <= n; i++) {
        f >> x;
        update(x, i);
    }
}

void rezolva() {
    int tip, a, b;
    for (int i = 1; i <= m; i++) {
        f >> tip;
        if (tip == 2) {
            f >> a;
            g << cauta(1, n, a) << '\n';
            continue;
        }
        f >> a >> b;
        if (tip == 0) update(b, a);
        else g << query(b) - query(a - 1) << '\n';
    }
}


int main() {
    citeste();
    rezolva();
}