Cod sursa(job #1609820)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 23 februarie 2016 01:44:34
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<cstdio>
int n,m,i,j,op,a,b,v[100100];
FILE *f,*g;
void upd( int poz , int val ){
    for(int i=poz; i<=n; i += ( i & ( -i ) ) )
        v[i] += val;
}
int query( int a, int b ){
    int s1=0,s2=0;
    for(int i=a-1; i>0; i -= ( i & ( -i ) ) )
        s1 += v[i];
    for(int i=b; i>0; i -= ( i & ( -i ) ) )
        s2 += v[i];
    return s2-s1;
}
int sum( int a ){
    int s=0,j=0,i=0;
    for(i=1; i<=n; i *= 2 );
    for( ; i>0; i/=2 ){
        if( i + j <= n && s + v[i+j] < a ){
            s+=v[i+j];
            j+=i;
        }
    }
    if( query( 1, j + 1 ) == a )
        return j+1;
    return -1;
}
int main(){
    f=fopen("aib.in","r");
    g=fopen("aib.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++){
        fscanf(f,"%d",&a);
        upd(i,a);
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d",&op);
        if(op==0){
            fscanf(f,"%d%d",&a,&b);
            upd(a,b);
        }
        if(op==1){
            fscanf(f,"%d%d",&a,&b);
            fprintf(g,"%d\n", query(a,b) );
        }
        if(op==2){
            fscanf(f,"%d",&a);
            fprintf(g,"%d\n",sum(a));
        }
    }







    fclose(f);
    fclose(g);
    return 0;
}