Cod sursa(job #1843003)

Utilizator vlasiuflaviusVlasiu Flavius vlasiuflavius Data 7 ianuarie 2017 22:40:41
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <algorithm>
#include <queue>
#define x first
#define y second
using namespace std;
pair < int , pair < long long , int > > v[300100];
priority_queue < pair < long long , int > > q;
long long i,n,k,rspp[300100],cs,cd,mij,rspfin,a;
int caut()
{
    while( q.size() )
        q.pop();
    int nr = 0;
    int rsp = 0;
    for( int i = 1 ; i <= n ; i++ )
        v[ i ].y.x -= mij - 1;
    for( i = 1 ; i <= n && nr + n - i + 1 >= k ; i++ )
    {
        if( v[ i ].y.x < v[ i ].x )
            continue;
        q.push( make_pair( -v[ i ].y.x , v[ i ].y.y ) );
        nr++;
        while( nr )
        {
            if( q.top().x * ( -1 ) < v[ i ].x )
                q.pop(),nr--;
            else
                break;
        }
        if( nr >= k )
        {
            rsp = 1;
            for( int i = 1 ; i <= k ; i++ )
            {
                rspp[ i ] = q.top().y;
                q.pop();
            }
            break;
        }
    }
    for( int i = 1 ; i <= n ; i++ )
        v[ i ].y.x += mij - 1;
    return rsp;
}
int main()
{
    cin>>n>>k;
    for( i = 1 ; i <= n ; i++ )
        cin>>v[ i ].x>>v[ i ].y.x, v[ i ].y.y = i;
    sort( v + 1 , v + n + 1 );
    cs = 1;
    cd = 2000000001;
    while( cs <= cd )
    {
        mij = ( cs + cd ) >> 1;
        a = caut();
        if( a )
        {
            cs = mij + 1;
            rspfin = cs - 1;
        }
        else
            cd = mij - 1;
    }
    cout<<rspfin<<'\n';
    if( rspfin )
    {
        sort( rspp + 1 , rspp + k + 1 );
        for( i = 1 ; i <= k ; i++ )
            cout<<rspp[ i ]<<" ";
    }
    else
        for( i = 1 ; i <= k ; i++ )
            cout<<i<<" ";
}