Cod sursa(job #1208278)

Utilizator mariusn01Marius Nicoli mariusn01 Data 15 iulie 2014 12:37:48
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

int A[200001];
int n, m, a, b, i, t, x;

int query(int p) {
    int r = 0;
    for (;p;p -= (p&-p) )
        r += A[p];
    return r;
}


void update(int p, int x) { // adaug x la pozitia p
    for (;p<=n;p += (p&-p))
        A[p] += x;
}

int search(int a) {
    // caut cea mai din stg pozitie k pentru care suma de la 1 la k este a
    int p = 1, st = 1;
    while (p <= n)
        p*=2;

    for (;p;p/=2) {
        if (st+p-1 <= n && A[st + p - 1] <= a) {
            a -= A[st + p - 1];
            if (a == 0)
                return st+p-1;
            st += p;
        }
    }

    return -1;
}

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

    fin>>n>>m;
    for (i=1;i<=n;i++) {
        fin>>x;
        update (i, x);
    }

    for (i=1;i<=m;i++) {
        fin>>t;
        if (t == 0) {
            fin>>a>>b;
            update(a, b);
        } else
            if (t == 1) {
                fin>>a>>b;
                fout<<query(b) - query(a-1)<<"\n";
            } else {
                fin>>a;
                fout<<search(a)<<"\n";
            }
    }

    return 0;
}