Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2566961) | Cod sursa (job #3331181)
#include <bits/stdc++.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, k;
int v[100001];
int d[100001];
int p[100001];
int bs ( int x, int lmax )
{
int st = 1, dr = lmax, sol = lmax + 1;
while ( st <= dr )
{
int mij = ( st + dr ) / 2;
if ( d[mij] >= x )
{
dr = mij - 1;
sol = mij;
}
else st = mij + 1;
}
return sol;
}
void afisare ( int i, int lmax, int x )
{
if ( i == 0 )
return;
if ( p[i] == lmax && v[i] < x )
{
afisare ( i - 1, lmax - 1, v[i] );
g << v[i] << " ";
}
else afisare ( i - 1, lmax, x );
}
int main()
{
int lmax = 1;
f >> n;
f >> v[1];
k = 1;
d[1] = v[1];
p[1] = 1;
for ( int i = 2; i <= n; i ++ )
{
d[i] = INT_MAX;
f >> v[i];
k = bs ( v[i], lmax );
p[i] = k;
d[k] = min ( v[i], d[k] );
lmax = max ( lmax, k );
}
g << lmax << '\n';
afisare( n, lmax, INT_MAX );
return 0;
}