Cod sursa(job #1438581)

Utilizator BLz0rDospra Cristian BLz0r Data 20 mai 2015 11:59:29
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
#include <vector>
using namespace std;

#define LSB(x)  ( (x) & -(x) )

FILE *f = fopen ( "aib.in", "r" );
FILE *g = fopen ( "aib.out", "w" );

int N, M, Size;
vector < int > AIB;

void Add ( int poz, int val ){

    for ( int i = poz; i <= Size; i += LSB(i) )
        AIB[i] += val;
}

int Sum ( int x ){
    int ret = 0;
    for ( int i = x; i > 0; i -= LSB(i) )
        ret += AIB[i];
    return ret;
}

int SumaInt ( int a, int b ){
    return Sum ( b ) - Sum ( a - 1 );
}

int bSearch ( int val ){
    int x = 0, interval = Size >> 1;

    while ( interval ) {
      if ( AIB[x + interval] <= val ) {
        val -= AIB[x + interval];
        x += interval;
      }
      interval >>= 1;
    }
    if ( !val )
        return x;
    return -1;
}

int main(){

    int x, y, type;

    fscanf ( f, "%d%d", &N, &M );

    for ( Size = 1; Size < N; Size <<= 1 );
    AIB.resize(Size+1);

    for ( int i = 1; i <= N; ++i ){
        fscanf ( f, "%d", &x );
        Add ( i, x );
    }

    for ( int i = 1; i <= M; ++i ){
        fscanf ( f, "%d", &type );

        if ( type == 0 ){
            fscanf ( f, "%d%d", &x, &y );
            Add ( x, y );
            continue;
        }

        if ( type == 1 ){
            fscanf ( f, "%d%d", &x, &y );
            fprintf ( g, "%d\n", SumaInt ( x, y ) );
            continue;
        }

        if ( type == 2 ){
            fscanf ( f, "%d", &x );
            fprintf ( g, "%d\n", bSearch ( x ) );
        }
    }

    return 0;
}