Pagini recente » Monitorul de evaluare | Cod sursa (job #2465699) | Cod sursa (job #3281763) | Cod sursa (job #2556391) | Cod sursa (job #2543568)
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int dim = (int) (1e5) + 1;
const int oo = (int) (1e9);
int n, v[dim], dp[dim], pr[dim], poz, l, a;
void cauta(int x)
{
int st = 1;
poz = 0;
for(st; st < n; st<<=1);
for(poz; st; st>>=1)
if(poz + st <= n && dp[poz + st] < x)
poz += st;
}
void afis(int p)
{
if(pr[p] == 1)
{
out<<v[p]<<' ';
return;
}
afis(pr[p]);
out<<v[p]<<' ';
}
int main()
{
in>>n;
for(int i = 1; i <= n; i++)
{
in>>v[i];
dp[i] = oo;
}
for(int i = 1;i <= n;i++)
{
cauta(v[i]);
if(v[i] < dp[poz + 1])
{
dp[poz + 1] = v[i];
pr[i] = poz + 1;
a = i;
if(poz + 1 > l)
l = poz + 1;
}
}
out<<l<<'\n';
afis(a);
return 0;
}