Cod sursa(job #3213088)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 12 martie 2024 14:47:45
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N_MAX = 100001;
int n, m;

int aib[N_MAX];

inline int ub(int x){
    return (x & (-x));
}

void add(int poz, int &val){
    for(; poz <= n; poz += ub(poz))
        aib[poz] += val;
}

int sum(int poz){
    int _sum = 0;

    for(; poz > 0; poz -= ub(poz))
        _sum += aib[poz];

    return _sum;
}

int binSearch(int st, int dr, int &a){
    if(st > dr)
        return -1;

    int m = (st + dr) >> 1;
    int s = sum(m);

    if(s >= a){
        if(s == a)
            return m;
        return binSearch(st, m-1, a);
    }else
        return binSearch(m + 1, dr, a);

}

int main()
{
    f >> n >> m;

    for(int i = 1, x; i <= n; ++i){
        f >> x;
        add(i, x);
    }

    int c, a, b, s, poz;
    while(m--){
        f >> c;
        switch(c){
            case 0:
                f >> a >> b;
                add(a, b);
                break;
            case 1:
                f >> a >> b;
                g << sum(b) - sum(a - 1) << '\n';
                break;
            case 2:
                s = 0, poz = 0;
                f >> a;
                for(int b=17; b>=0; b--){
                    if(poz + (1<<b) <= n && s + aib[poz + (1<<b)] < a){
                        s += aib[poz + (1<<b)];
                        poz += (1<<b);
                    }
                }
                if(poz + 1 > n || sum(poz + 1) != a){
                    g << -1 << '\n';
                }else
                    g<< poz + 1 << '\n';
                break;
        }
    }

    return 0;
}