Cod sursa(job #1232941)

Utilizator irimiecIrimie Catalin irimiec Data 24 septembrie 2014 12:43:54
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <iostream>
#define MAXN 100001

using namespace std;

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

int n, m, s, aib[MAXN];

inline void update(int pos, int val) {
    int c = 0;
    while(pos <= n) {
        aib[pos] += val;
        while( !(pos & (1 << c)) ) c++;
        pos += (1 << c);
        c++;
    }
}

inline int query(int pos) {
    int c = 0, s = 0;
    while(pos > 0) {
        s += aib[pos];
        while( !(pos & (1 << c)) ) c++;
        pos -= (1 << c);
        c++;
    }
    return s;
}

int search(int sum) {
    int pos = n+1, B = n;
    int limst = 0, limdr = n + 1;

    s = query(B);

    while( B ) {
        B = (limst + limdr) >> 1;
        s = query(B);

        if( s > sum ) {
            if( limdr > B ) limdr = B;
            B--;
        }
        else if( s == sum ) pos = min(pos, B), limdr = B, B--;
        else {
            if( limst < B ) limst = B;
            B++;
        }
        if( B <= limst ) break;
        if( B >= limdr ) break;
    }

    if( pos == n + 1 ) return -1;
    return pos;
}

int main() {
    int val, code, x, y;

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

    while( m-- ) {
        f >> code;
        if(code == 0) {
            f >> x >> val;
            update(x, val);
        } else if (code == 1) {
            f >> x >> y;
            g << query(y) - query(x - 1) << "\n";
        } else {
            f >> x;
            g << search(x) << "\n";
        }
    }
}