Pagini recente » Cod sursa (job #2777953) | Cod sursa (job #2987997) | Istoria paginii utilizator/poison_girl | Istoria paginii runda/puh/clasament | Cod sursa (job #1466071)
#include <iostream>
#include <fstream>
using namespace std ;
// Se folosesc 3 vectori ( V - ce tine elem vect , Q - initial vid , se ia fiecare elem din V si se suprascrie peste cel mai mic elem din Q
// care este mai mare decat cel din V .. daca cel din V e mai mare ca toate din Q .. este adaugat la finalul lui Q ) , P - poz pe care
// a fost bagat elementul din V in vect Q
ifstream fin ("scmax.in") ;
ofstream fout ("scmax.out") ;
int N , V [ 100001 ] , Q [ 100001 ] , P [ 100001 ] , lg_Q , sol [ 1000001 ] , lg_sol ;
void Citire ()
{
fin >> N ;
for ( int i = 1 ; i <= N ; ++ i )
fin >> V [i] ;
}
int Insert ( int val ) // cautare binara
{
int st = 0 , dr = lg_Q ; // cautarea se face doar in elementele din Q pana atunci bagate ;
while ( st <= dr )
{
int mid = ( st + dr ) >> 1 ;
if ( Q [ mid ] < val && Q [ mid + 1 ] >= val )
{
Q [ mid + 1 ] = val ; return ( mid + 1 ) ;
}
else
if ( Q [ mid ] < val )
st = mid + 1 ;
else
dr = mid - 1 ;
}
Q [ ++ lg_Q ] = val ;
return lg_Q ;
}
void AfisareSol ( int poz )
{
while ( poz >= 1 )
if ( P [ poz ] == lg_Q )
{
sol [ ++ lg_sol ] = V [ poz ] ;
-- lg_Q , -- poz ;
}
else -- poz ;
fout << lg_sol << "\n" ;
for ( int i = lg_sol ; i >= 1 ; -- i )
fout << sol [i] << " " ;
}
int main ()
{
Citire () ;
lg_Q = 1 ;
Q [ 1 ] = V [ 1 ] ;
P [ 1 ] = 1 ;
for ( int i = 2 ; i <= N ; ++ i )
{
int poz = Insert ( V [i] ) ;
P [i] = poz ;
}
int last ;
for ( int i = 1 ; i <= N ; ++ i )
if ( P [i] == lg_Q )
last = i ;
AfisareSol ( last ) ;
return 0 ;
}