Cod sursa(job #1190360)

Utilizator hrazvanHarsan Razvan hrazvan Data 25 mai 2014 10:19:21
Problema Arbori indexati binar Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#define N_MAX 100000
int aib[ N_MAX + 1 ];

inline int ultb ( int x ){
    return x & ( -x );
}

inline int suma( int poz ){
    int sum = 0;
    while ( poz > 0 ){
        sum += aib[ poz ];
        poz -= ultb( poz );
    }
    return sum;
}

inline void adaug ( int val, int poz, int n ){
    while( poz <= n ){
        aib[ poz ] += val;
        poz += ultb ( poz );
    }
    return ;
}

int main()
{
    FILE *in = fopen ( "aib.in", "r" );
    int n, m;
    fscanf ( in, "%d%d", &n, &m );
    int i, nr;
    for ( i = 1; i <= n; i++ ){
        fscanf ( in, "%d", &nr );
        adaug ( nr, i, n );
    }
    int tip, a, b;
    FILE *out = fopen ( "aib.out", "w" );
    for ( i = 1; i <= m; i++ ){
        fscanf ( in, "%d", &tip );
        if ( tip == 0 ){
            fscanf ( in, "%d%d", &a, &b );
            adaug ( b, a, n );
        }
        else  if ( tip == 1 ){
            fscanf ( in, "%d%d", &a, &b );
            fprintf ( out, "%d\n", suma ( b ) - suma( a - 1 ) );
        }
        else{
            fscanf ( in, "%d", &a );
            int poz = 0, pas = 1 << 16;
            while ( pas > 0 ){
                if ( poz + pas <= n && suma ( poz + pas ) <= a ){
                    poz += pas;
                }
                pas >>= 1;
            }
            if ( suma ( poz ) == a )     fprintf ( out, "%d\n", poz );
            else                         fprintf ( out, "-1\n" );
        }
    }
    fclose ( in );
    fclose ( out );
    return 0;
}