Cod sursa(job #911473)

Utilizator Sm3USmeu Rares Sm3U Data 11 martie 2013 18:34:35
Problema Arbori indexati binar Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>

#define nMax 100100

using namespace std;

int n;
int a[nMax];


void add(int i, int val){
    int k = 0;
    while(i <= n){
        a[i] += val;
        while((i & (1 << k)) == 0){
            k ++;
        }
        i += 1 << k;
        k ++;
    }
    return;
}

int ceaMaiMareP(int x){
    int k = 0;
    while(1 << k <= x){
        k ++;
    }
    return 1 << (k - 1);
}

int unuX(int x){
    int s = 0;
    int p = 0;
    while (p != x){
        p += ceaMaiMareP(x - p);
        s += a[p];
    }
    return s;
}

int interval(int st, int dr){
    return unuX(dr) - unuX(st - 1);
}

void doi(int SC){
    int st = 1;
    int dr = n + 1;
    int mij;
    int s = 0;
    while(st != dr){
        mij = (st + dr) >> 1;
        s = unuX(mij);
        if(SC == s){
            break;
        }
        if(s > SC){
            dr = mij;
        }else{
            st = mij + 1;
        }
    }
    if(s == SC){
        printf("%d\n", mij);
    }else{
        printf("-1\n");
    }
}

void citire(){
    int m;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; ++ i){
        int x;
        scanf("%d", &x);
        add(i, x);
    }
    while(m --){
        int caz;
        int x;
        int y;
        scanf("%d %d", &caz, &x);
        if(caz == 0){
            scanf("%d", &y);
            add(x, y);
        }
        if(caz == 1){
            scanf("%d", &y);
            printf("%d\n", interval(x,y));
        }
        if(caz == 2){
            doi(x);
        }
    }
}

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

    citire();

    return 0;
}