Pagini recente » Cod sursa (job #450117) | Cod sursa (job #2950410) | Cod sursa (job #1565060) | Cod sursa (job #3201713) | Cod sursa (job #341821)
Cod sursa(job #341821)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
#define mp make_pair
#define pb push_back
#define sz(c) (int)((c).size())
#define f first
#define s second
#define fin "scmax.in"
#define fout "scmax.out"
#define NMAX 100100
int N, elMin[NMAX], best;
int v[NMAX], tat[NMAX];
void ReadData()
{
ifstream f(fin);
f >> N;
for ( int i = 1; i <= N; ++i )
f >> v[i];
f.close();
}
void Solve()
{
int i, lo, hi, mid;
best = 0;
for ( i = 1; i <= N; ++i )
{
lo = 0; hi = best;
while ( lo <= hi )
{
mid = lo + (hi-lo)/2;
if ( v[ elMin[mid] ] < v[i] )
lo = mid + 1;
else
hi = mid - 1;
}
if ( lo > best )
best = lo, elMin[ best ] = i;
if ( v[i] < v[ elMin[ lo ] ] )
elMin[ lo ] = i;
if ( lo > 0 )
tat[i] = elMin[lo - 1];
else
tat[i] = 0;
}
}
void trace(int x, ofstream &f)
{
if ( x == 0 ) return ;
trace(tat[x],f);
f << v[x] << " ";
}
void PrintSol()
{
ofstream f(fout);
f << best << endl;
trace(elMin[best],f);
f.close();
}
int main()
{
ReadData();
Solve();
PrintSol();
return 0;
}