Cod sursa(job #2817129)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 12 decembrie 2021 22:27:13
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.62 kb
#include <stdio.h>
    
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
    
static inline int min( int a, int b ) {
    return ( a <= b ? a : b );
}
 
static inline int max( int a, int b ) {
    return ( a >= b ? a : b );
}
 
static inline int mod( int x ) {
    return x < 0 ? -x : x;
}
    
FILE *fin;
 
int poz, valBuff;
static char buff[ ( 1 << 8 ) ];
static inline char nextChar() {
    if( poz == valBuff ) {
        fread( buff, 1, valBuff, fin );
        poz = 0;
    }
 
    return buff[ poz++ ];
}
 
static bool f[ 100 ];
static inline int readInt() {
    int rez = 0;
    int ch;
 
    while( !f[ ch = nextChar() ] );
    do
        rez = rez * 10 + ch - '0';
    while( f[ ch = nextChar() ] );
 
    return rez;
}
 
/////////////////////////////////////////////////////////////////////////////////////////////
#define val( a ) ( a & ( -a ) )
#define MAX 100000

int aib[ MAX + 1 ];
int n;

void make() {
    for( int i = 1; i <= n; i++ ) {
        aib[ i ] += readInt();
        if( i + val( i ) <= n )
            aib[ i +  val( i ) ] += aib[ i ];
    }
}

void update( int poz, int val ) {
    while( poz <= n ) {
        aib[ poz ] += val;
        poz += val( poz );
    }
}

int suma( int poz ) {
    int rez = 0;
    while( poz > 0 ) {
        rez += aib[ poz ];
        poz -= val( poz );
    }
    return rez;
}

int cauta( const int s ) { // am incercat sa fac cu Patrascu dar nu vrea :/
    int left = 1, med;
    int right = n, sol;

    while( left <= right ) {
        med = ( left + right ) >> 1;
        if( suma( med ) >= s ) {
            right = med - 1;
            sol = med;
        } else left = med + 1;
    }

    if( suma( sol ) == s )
        return sol;
    return -1;
}

int main()
{ 
    f[ '0' ] = f[ '1' ] = f[ '2' ] = f[ '3' ] = f[ '4' ] = 1;
    f[ '5' ] = f[ '6' ] = f[ '7' ] = f[ '8' ] = f[ '9' ] = 1;
    valBuff = sizeof( buff );
 
    fin = fopen( "aib.in", "r" );
    fread( buff, 1, valBuff, fin );
 
    n = readInt();
    int q = readInt();

    make();

    int cerinta;
    FILE *fout = fopen( "aib.out", "w" );
    while( q-- ) {
        cerinta = readInt();

        if( cerinta == 2 )
            fprintf( fout, "%d\n", cauta( readInt() ) );
        else if( cerinta == 1 ) {
            int a = readInt();
            int b = readInt();
            fprintf( fout, "%d\n", -suma( a - 1 ) + suma( b ) ); // nush dc nu merge 
        }
        else {
            int a = readInt();
            int b = readInt();
            update( a, b ); /// nush dc nu a mers sa sciu update( readInt(), readInt() ) ???
        }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}