Cod sursa(job #1373829)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 4 martie 2015 20:48:16
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");

const int kNMax = 100100;
int aib[kNMax], n;

int Sum(int nod) {
    int s = 0;
    while (nod) {
        s += aib[nod];
        nod -= (nod&-nod);
    }
    return s;
}

void Update(int nod, int val) {
    while (nod <= n) {
        aib[nod] += val;
        nod += (nod&-nod);
    }
}

int CautBin(int x) {
    int st = 1, dr = n, mij, sum;
    while (st <= dr) {
        mij = (st + dr) / 2;
        sum = Sum(mij);
        if(sum == x)
            return mij;
        if(sum < x)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    return -1;
}

int main() {
    int m, a, b, k, optiune;
    in >> n >> m;
    for (int i = 1; i <= n; ++i) {
        in >> b;
        Update(i, b);
    }
    for (int i = 1; i <= m; ++i) {
        in >> optiune;
        if (optiune == 0) {
            in >> a >> b;
            Update(a, b);
        } else if(optiune == 1) {
            in >> a >> b;
            out << Sum(b) - Sum(a - 1) << '\n';
        } else {
            in >> k;
            out << CautBin(k) << '\n';
        }
    }
    in.close();
    out.close();
    return 0;
}