Cod sursa(job #2019603)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 8 septembrie 2017 09:41:10
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define ub(x) (x&(-x))
using namespace std;

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

int N, M, AIB[100003];
void add(int poz, int val) {
    for(int i = poz; i <= N; i += ub(i)) AIB[i] += val;
}
int sum(int poz) {
    int s = 0;
    for(int i = poz; i > 0; i -= ub(i))
        s += AIB[i];
    return s;
}
int cautbin(int x) {
    int st = 1, dr = N, ans = -1, mij = 0;
    while(st <= dr) {
        mij = (st + dr) / 2;
        int nr = sum(mij);
        if(nr == x) {
            ans = mij;
            break;
        }
        else if(nr < x) st = mij + 1;
        else            dr = mij - 1;
    }
    return ans;
}
int main()
{
    f >> N >> M;
    int x = 0, cer = 0, a = 0, b = 0;;
    for(int i = 1; i <= N; i++)
        f >> x, add(i, x);
    for(int i = 1; i <= M; i++) {
        f >> cer;
        if(cer == 0) f >> a >> b, add(a, b);
        else if(cer == 1) f >> a >> b,
                          g << sum(b) - sum(a - 1) << "\n";
        else if(cer == 2) {
            f >> x;
            g << cautbin(x) << "\n";
        }
    }
    return 0;
}