Pagini recente » Cod sursa (job #3362581) | Cod sursa (job #3362580) | Cod sursa (job #3362579) | Cod sursa (job #3362539) | Cod sursa (job #3363391)
#include <iostream>
using namespace std;
int v[100005], dp[100005], pre[100005], sol[100005];
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int n, Lmax = 0;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> v[i];
}
for(int i = 1; i <= n; i++)
{
int st = 1;
int dr = Lmax;
int poz = Lmax + 1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(v[dp[mij]] >= v[i])
{
poz = mij;
dr = mij - 1;
}
else {
st = mij + 1;
}
}
if(poz > 1)
{
pre[i] = dp[poz - 1];
}
else
{
pre[i] = 0;
}
dp[poz] = i;
if(poz > Lmax)
{
Lmax = poz;
}
}
cout << Lmax << "\n";
int x = dp[Lmax], k = Lmax;
while(x != 0)
{
sol[k] = v[x];
k--;
x = pre[x];
}
for(int i = 1; i <= Lmax; i++)
{
cout << sol[i] << " ";
}
return 0;
}