Cod sursa(job #2689382)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 20 decembrie 2020 15:17:50
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <fstream>

#define sub first
#define r second
#define tsub first.second
#define index second.second

using namespace std;

const int NMAX = 100005;

ifstream fin("dezintegrare.in");
ofstream fout("dezintegrare.out");

long long N, Q, t;
pair < long long, long long > S[NMAX];
pair < long long, long long> T[NMAX];
long long tim, m_time;
long long new_idx;
long long nt;

int BS( int lf, int rg, int val )

{

    if( lf > rg ) return 0;



    int mid = lf + ( rg - lf )/2;



    if( T[mid].first <= val ) return max( mid, BS( mid+1, rg, val ) );

    else return BS( lf, mid-1, val );

}
void Solve()
{
    fin >> N >> Q;

    T[1].first = 0;
    T[1].second =1;
    nt = 1;

    for( int i = 1; i <= N; ++i )
    {
        fin >> S[i].first >> S[i].second;
        if( S[i].first < S[T[1].second].first )
            T[1].second = i;
    }

    bool next = true;

    while( next )
    {
        next = false;

        m_time = ( 1 << 30 );

        for( int i = 1; i <= N; ++i )
            if( S[T[nt].second].r <  S[i].r )
            {
                next = true;

                tim = (S[i].sub - S[T[nt].second].sub )/( S[i].r - S[T[nt].second].r );
                tim++;

                //cout << time << ' ' << i << '\n';

                if( tim < m_time || ( tim == m_time && 1LL* ( S[new_idx].sub-1LL* tim*S[new_idx].r) > 1LL* ( 1LL* S[i].sub - 1LL*tim*S[i].r) ))
                {
                    m_time = tim;
                    new_idx = i;
                }
            }

        if( next == false ) continue;

        nt++;
        T[nt] = make_pair( m_time, new_idx ) ;
    }

    //for( int i = 1; i <= nt; ++i )fout << T[i].first << ' ' << T[i].second << '\n';

    for( int i = 1; i <= Q; ++i )
    {
        fin >> t;
        fout << T[BS( 1, nt, t )].second<< '\n';

    }
}
int main()
{
    Solve();
    return 0;
}