Cod sursa(job #1685272)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 11 aprilie 2016 16:30:18
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<cstdio>
#define DIM 100005
#define lli long long int
#define zeros(x) ( ( x ^ (x-1) ) & x )
FILE *f=fopen("aib.in","r"), *g=fopen("aib.out","w");

lli N, M, aib[DIM];

void Add( int nr, int poz ){
lli i;

    for(i=poz;i<=N;i+=zeros(i))
        aib[i] += nr;

}

lli Sum( lli poz ){
lli i, R = 0;

    for(i=poz;i>=1;i-=zeros(i))
        R += aib[i];

    return R;
}

void Citire(){
lli i, x;

    fscanf(f,"%lld %lld\n",&N,&M);

    for(i=1;i<=N;i++){

        fscanf(f,"%lld",&x);
        Add(x,i);

    }

}

void Rezolvare(){
lli i, tip, a, b, p, u, mij, sum;

    for(i=1;i<=M;i++){

        fscanf(f,"%lld",&tip);

        if( tip == 0 ){

            fscanf(f,"%lld %lld",&a,&b);
            Add(b,a);

        }

        if( tip == 1 ){

            fscanf(f,"%lld %lld",&a,&b);
            fprintf(g,"%lld\n", Sum(b) - Sum(a-1) );

        }

        if( tip == 2 ){

            fscanf(f,"%lld",&a);

            p = 1;
            u = N;

            while( p <= u ){

                mij = ( p + u ) / 2;

                if( Sum(mij) >= a )
                    u = mij-1;
                else
                    p = mij+1;

            }

            if( Sum(p) == a )
                fprintf(g,"%lld\n",p);
            else
                fprintf(g,"-1\n");

        }

    }

}

int main(){

    Citire();
    Rezolvare();

return 0;
}