Cod sursa(job #2016628)

Utilizator LucaSeriSeritan Luca LucaSeri Data 29 august 2017 21:09:24
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

const int MaxN = 1e5 + 10;

int v[MaxN], AIB[MaxN];

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

void add(int n, int ind, int val){
    for(int i = ind; i <= n; i += zeros(i)){
        AIB[i] += val;
    }
}

int query(int n, int ind){
    int ans = 0;
    for(int i = ind; i > 0; i -= zeros(i)){
        ans += AIB[i];
    }

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

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

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

    for(int i = 1; i <= n; ++i){
        scanf("%d", &v[i]);
        add(n, i, v[i]);
    }
    for(int i = 0;i < m; ++i){
        int cd, a, b;
        scanf("%d", &cd);
        if(cd < 2){
            scanf("%d%d", &a, &b);
        }
        else scanf("%d", &a);

        if(cd == 0){
            add(n, a, b);
        }
        if(cd == 1){
            printf("%d\n", query(n, b) - query(n, a-1));
        }
        if(cd == 2){
            int best = 0;
            int log = 1 << (31 - __builtin_clz((unsigned)n));
            for(; log; log >>= 1){
                if(best+log <= n && query(n, best+log) <= a){
                    best += log;
                }
            }

            if(query(n, best) == a) printf("%d\n", best);
            else printf("-1\n");
        }
    }
    return 0;
}