Pagini recente » Cod sursa (job #1291135) | Cod sursa (job #1409542) | Cod sursa (job #154431) | Cod sursa (job #1460358) | Cod sursa (job #1260752)
#include <iostream>
#include <cstdio>
using namespace std;
int a[100010], q[100010], p[100010];
int up=1, n;
int cautBin(int x, int n)
{
int s = 1, d = n;
while (s <= d)
{
int mid = (s+d)/2;
if (x > q[mid])
s = mid + 1;
else if (x < q[mid])
d = mid - 1;
else
return mid;
}
return s;
}
void sol()
{
int pos;
q[1] = a[1];
up = 1;
p[1] = 1;
for (int i = 2; i <= n; i++)
{
if (a[i] > q[up])
{
q[++up] = a[i];
p[i] = up;
}
else
{
pos = cautBin(a[i], up);
q[pos] = a[i];
p[i] = pos;
}
}
cout << up << "\n";
}
void drum()
{
int afis[100010], nq=0;
for (int i = n; i > 0 && up != 0; i--)
{
if (p[i] == up)
{
afis[++nq] = a[i];
up--;
}
}
for (int i = nq; i >= 1; i--)
cout << afis[i] << " ";
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
sol();
drum();
return 0;
}