Cod sursa(job #1427721)

Utilizator tudorcomanTudor Coman tudorcoman Data 2 mai 2015 22:38:54
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb

#include <stdio.h>

int bin[100001], N;

int remove (int k) {
    return k & (k - 1);
}

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

int ask (int k) {
    int Ans = 0;
    
    for (int i = k; i > 0; i -= zeros(i))
        Ans += bin[i];
    return Ans;
}

void Add (int pos, int val) {
    
    for (int i = pos; i <= N; i += zeros(i))
        bin[i] += val;
}

int caut (int target) {
    
    int l = 1, r = N, m, s;
    
    while (l <= r) {
        m = (l + r) >> 1;
        s = ask (m);
        if (s == target)
            return m;
        if (s < target)
            l = m + 1;
        else r = m - 1;
    }
    
    return -1;
   
}
int main(int argc, const char * argv[]) {
    
    freopen ("aib.in", "r", stdin);
    freopen ("aib.out", "w", stdout);
    
    int T,x;
    scanf("%d%d",&N,&T);
    
    for (int i=1; i <= N; ++ i) {
        scanf("%d",&x);
        Add (i, x);
    }
    
    while (T -- ) {
        scanf("%d",&x);
        switch (x) {
            case 0 : {
                int a,b;
                scanf("%d%d",&a,&b);
                Add(a,b);
                break;
            }
            case 1: {
                int a,b;
                scanf("%d%d",&a,&b);
                printf("%d\n",ask(b) - ask(a - 1));
                break;
            }
            default : {
                scanf("%d",&x);
                printf("%d\n",caut(x));
                
            }
        }
    }
    return 0;
}