Cod sursa(job #2042381)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 18 octombrie 2017 15:55:39
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>

using namespace std;

class Aib{
private:
    int sir[100005];
    int n;

    int specialPower(int x){
        return ((x ^ (x - 1)) & x);
    }

    int sumToElemnt(int x){
        int sum = 0;

        while(x > 0){
            sum += sir[x];
            x -= specialPower(x);
        }

        return sum;
    }
public:

    Aib(int l){
        n = l;
        for(int i = 0; i <= l; i++){
            sir[i] = 0;
        }
    }

    void add(int poz, int val){
        while(poz <= n){
            sir[poz] += val;
            poz += specialPower(poz);
        }
    }

    int sum(int start, int end){
        return sumToElemnt(end) - sumToElemnt(start - 1);
    }

    int querry(int a){
        int st = 1;
        int dr = n;

        while(st < dr){
            int m = (st + dr) / 2;
            int nr = sumToElemnt(m);

            if(nr == a){
                dr = m;
            }
            else if(nr > a){
                dr = m - 1;
            }
            else if(nr < a){
                st = m + 1;
            }
        }

        return st;
    }
};

int main() {
//    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    int n, m;
    scanf("%d %d", &n, &m);

    Aib aib(n);

    for(int i = 0; i < n; i++){
        int tmp;
        scanf("%d", &tmp);
        aib.add(i + 1, tmp);
    }

    for(int i = 0; i < m; i++){
        int caz;
        scanf("%d", &caz);

        switch (caz){
            case 0:
                int poz, val;
                scanf("%d %d", &poz, &val);
                aib.add(poz, val);
                break;
            case 1:
                int st, dr;
                scanf("%d %d", &st, &dr);
                printf("%d\n", aib.sum(st, dr));
                break;
            case 2:
                int el;
                scanf("%d", &el);
                printf("%d\n", aib.querry(el));
                break;
        }
    }

    return 0;
}