Cod sursa(job #1750440)

Utilizator razvandRazvan Dumitru razvand Data 30 august 2016 11:32:36
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 4.3 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

class ifbuffer {
    private:
        char text[100000];
        int size;
        int pos;
        bool isDigit[128];

        FILE *file;

        inline void refill( void ) {
            pos = 0;
            fread( text, 1, size, file );
        }

        inline char getc() {
            char c = text[pos ++];

            if ( pos == size )
                refill();

            return c;
        }

        inline int getnr() {
            char c = getc();
            int nr = 0;

            while ( !isDigit[c] )
                c = getc();
            while ( isDigit[c] ) {
                nr = nr * 10 + c - '0';
                c = getc();
            }

            return nr;
        }

    public:
        inline ifbuffer( char * path, int s = 100000 ) {
            size = s;

            file = fopen( path, "r" );

            int i;
            for ( i = 0; i < '0'; i ++ )
                isDigit[i] = false;
            for ( i = '0'; i <= '9'; i ++ )
                isDigit[i] = true;
            for ( i = '9' + 1; i < 128; i ++ )
                isDigit[i] = false;

            refill();
        }

        inline ifbuffer &operator>>( int &v ) {
            v = getnr();
            return *this;
        }

        inline ifbuffer &operator>>( char &v ) {
            v = getc();
            return *this;
        }

        inline void close() {
            fclose( file );
        }
};

class ofbuffer {
    private:
        char text[100000];
        int size;
        int pos;
        bool isDigit[128];

        FILE *file;

        inline void clear( void ) {
            pos = 0;
            fwrite( text, 1, size, file );
        }

        inline void putc( char c) {
            text[pos ++] = c;

            if ( pos == size )
                clear();
        }

        inline void putnr( int nr ) {
            if ( nr < 0 ) {
                putc( '-' );
                nr =- nr;
            }

            int p10;
            for ( p10 = 1; p10 * 10LL <= nr; p10 *= 10 );
            for ( ; p10 > 0; p10 /= 10 )
                putc( nr / p10 % 10 + '0' );
        }

    public:
        inline ofbuffer( char * path, int s = 100000 ) {
            size = s;

            file = fopen( path, "w" );

            int i;
            for ( i = 0; i < '0'; i ++ )
                isDigit[i] = false;
            for ( i = '0'; i <= '9'; i ++ )
                isDigit[i] = true;
            for ( i = '9' + 1; i < 128; i ++ )
                isDigit[i] = false;
        }

        inline ofbuffer &operator<<( int v ) {
            fprintf( file, "%d", v );
            return *this;
        }

        inline ofbuffer &operator<<( char v ) {
            fputc( v, file );
            return *this;
        }

        inline void close() {
            fclose( file );
        }
};

ifbuffer in("cautbin.in");
ofbuffer out("cautbin.out");
int v[100003];
int n;

int lwb(int x) {
    int st = 1;
    int dr = n;
    int t1;
    int t2;
    int poz = n+1;

    while(st <= dr) {

        t1 = st + (dr-st)/3;
        t2 = dr - (dr-st)/3;

        //cout << st << ' ' << dr << ' ' << t1 << " " << t2 << '\n';

        if(v[t1] >= x)
            poz = min(poz, t1), dr = t1-1;
        if(v[t1] <= x && v[t2] >= x)
            poz = min(poz, t2), st = t1+1, dr = t2-1;
        if(v[t2] <= x)
            st = t2+1;

    }

    return poz;

}

int main() {

    in >> n;

    for(int i = 1; i <= n; i++)
        in >> v[i];

    int q,x,y;
    in >> q;

    for(int i = 1; i <= q; i++) {

        in >> x >> y;

        if(x == 0) {
            int lw = lwb(y+1);
            if(lw == 1)
                out << -1 << '\n';
            else if(v[lw-1] != y)
                out << -1 << '\n';
            else
                out << lw-1 << '\n';
        } else if(x == 1) {
            int lw = lwb(y+1);
            if(lw == 1)
                out << lw << '\n';
            else
                out << lw-1 << '\n';
        } else {
            int lw = lwb(y);
            //cout << "T " << lw << '\n';
            out << lw << '\n';
        }

    }

    return 0;
}