Cod sursa(job #1385389)

Utilizator razboi4Manole Iulian razboi4 Data 11 martie 2015 22:08:53
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<bits/stdc++.h>
using namespace std;
int N, M, Arb[131072];
void Uptade(int poz, int val)
{
    while(poz <= N) {
        Arb[poz] += val;
        int C = 0;
        while(!(poz & (1 << C)))
            ++ C;
        poz += (1 << C);
    }
}

int Query(int poz)
{
    int Sum = 0;
    while(poz > 0){
        Sum += Arb[poz];
        int C = 0;
        while(!(poz & (1 << C)))
            ++ C;
        poz -= (1 << C);
    }
    return Sum;
}

int Search(int Sum)
{
    int step, i;
    for(step = 1; step < N; step <<= 1);
    for(i = 1; step; step >>= 1)
        if(i + step <= N && Query(i + step) <= Sum)
            i += step;
    if(Query(i) == Sum)
        return i;
    return -1;
}

int main()
{
    int val,a,b;
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d%d", &N, &M);
    for(int i = 1; i <= N; Uptade(i, val), ++ i )
        scanf("%d", &val);
    for( ; M ; --M ) {
        scanf("%d", &val);
        if(val == 0) {
            scanf("%d %d", &a, &b);
            Uptade(a, b);
        }
        if(val ==1 ) {
            scanf("%d %d", &a, &b);
            printf("%d\n", Query(b) - Query (a - 1));
        }
        if(val == 2) {
            scanf("%d", &a);
            printf("%d\n", Search(a));
        }

    }
    return 0;
}