Cod sursa(job #1264062)

Utilizator isa_mirica_mihaiMirica Matei isa_mirica_mihai Data 15 noiembrie 2014 14:57:14
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>

int n, aib[100001];

void update (int poz, int val){
    for (;poz <= n;poz = poz + (poz & (poz - 1) ^ poz))
      aib[poz] += val;
}

int querry (int poz){
    int s;
    s = 0;
    for(; poz; poz = poz - (poz & (poz - 1) ^ poz))
      s =s + aib[poz];
    return s;

}
int caut(int val){
    int i, poz;
    for (poz = 1; poz < n; poz <<= 1);
    for(i = 0; poz; poz /=  2){
         if(i + poz <= n){
            if(val >= aib[i + poz]){
                i += poz;
                val -= aib[i];
                if (val == 0)
                  return i;
            }
         }
    }
    return -1;
}
int main(){
    FILE *fin, *fout;
    int i, a, b, op, m;
    fin = fopen("aib.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    for (i = 1; i <= n; i++){
        fscanf(fin, "%d", &a);
        update(i, a);
    }
    fout=fopen("aib.out","w");
    for (i = 0; i < m; i++){
        fscanf(fin, "%d", &op);
        if (op < 2){
            fscanf(fin, "%d%d", &a, &b);
            if (op == 0)
                update(a ,b);
            else
                fprintf(fout, "%d\n", querry(b) - querry(a-1));
        }
        else {
            fscanf(fin, "%d", &a);
            fprintf(fout, "%d\n", caut(a));
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}