Cod sursa(job #943339)

Utilizator manciu_ionIon Manciu manciu_ion Data 24 aprilie 2013 23:05:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

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

class Fenwick {
public:
    Fenwick( int n ) :n(n) {
        a.resize(n+1);
        for (int i = 1; i <= n; ++i) {
            fin >> a[i];
        }
        for (msb = 1; msb <= n; msb <<= 1);
        msb >>= 1;

        for (int stp = 2; stp <= n; stp<<=1)
            for (int i = stp; i <= n; i += stp)
                a[i] += a[i-(stp>>1)];
    }

    inline void update( int lo, int val ) {
        for (; lo <= n; lo += (lo & -lo))
            a[lo] += val;
    }

    inline int getsum( int lo, int hi ) {
        return getsum(hi)-getsum(lo-1);
    }

    inline int getsum( int hi ) {
        int sum = 0;
        for (; hi > 0; hi &= hi-1)
            sum += a[hi];
        return sum;
    }

    int idx_with_sum( int sum ) {
        int idx = 0;
        for (int stp = msb; stp > 0; stp >>= 1) {
            idx += stp;
            if (idx <= n && sum >= a[idx]) {
                sum -= a[idx];
                if (sum == 0) return idx;
            }
            else idx -= stp;
        }
        return -1;
    }

    vector<int> a;
    int n;
    int msb;
};

int main() {
    int n, m;
    fin >> n >> m;

    Fenwick bit(n);
    int op, lo, hi, val;

    for (int i = 0; i < m; ++i) {
        fin >> op;
        if (op == 0) {
            fin >> lo >> val;
            bit.update(lo, val);
        }
        else if (op == 1) {
            fin >> lo >> hi;
            fout << bit.getsum(lo, hi) << '\n';
        }
        else if (op == 2) {
            fin >> val;
            fout << bit.idx_with_sum(val) << '\n';
        }
    }

    return 0;
}