Cod sursa(job #1765334)

Utilizator MateiMCCiurezu Matei MateiMC Data 26 septembrie 2016 17:32:12
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
FILE *in,*out;
long n, m, aib[100005],x,suma=5,a,b,rezultat;
int op;

void update(long i, long val){
    while(i<=n){
        aib[i]+=val;
        i = i + (i & -i);
    }
}

void citireAIB(){
    for(long i=1; i<=n; i++){
        fscanf(in,"%ld",&x); //
        update(i,x);
    }
}


long obtSuma(long i){
    long s=0;
    while(i>0){
        s+=aib[i];
        i = i - (i & -i);
    }
    return s;
}


long cautBin(long x){
    long st=1, dr=n, mij;
    while (st<=dr){
        mij=(st+dr)/2;
        suma = obtSuma(mij);
        if (suma==x){
            return mij;
        }
        else if (suma>x){
            dr=mij-1;
        }
        else st=mij+1;
    }
    return -1;
}



void op0(){
    fscanf(in,"%ld%ld", &a, &b); //
    update(a,b);
}

void op1(){
    fscanf(in,"%ld%ld", &a, &b); //
    suma = obtSuma(b) - obtSuma(a-1);
    fprintf(out,"%ld\n", suma); //
}

void op2(){
    fscanf(in,"%ld",&a);
    rezultat = cautBin(a);
    fprintf(out,"%ld\n",rezultat);
}


int main()
{
    in=fopen("aib.in", "r");
    out =fopen("aib.out", "w");

    fscanf(in,"%ld%ld",&n,&m); //

    for(long i=1; i<=n; i++){
        aib[i]=0;
    }

    citireAIB();

    for(long z=1; z<=m; z++){
        fscanf(in,"%d",&op);
        if(op==0) op0();
        else if(op==1) op1();
        else if(op==2) op2();
    }

    return 0;
}