Pagini recente » Cod sursa (job #328797) | Cod sursa (job #1224010)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define MAXN 100005
using namespace std;
int n, a[MAXN], stiva[MAXN], best[MAXN], prev[MAXN];
int poz, nr;
void citire()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
}
void afisare(int p)
{
if (p == -1)
return;
afisare(prev[p]);
printf("%d ", a[p]);
}
int place(int x)
{
/* int lo = 0, hi = nr - 1, mid;
while (lo <= hi)
{
mid = (lo + hi) / 2;
}
if (hi < 0)
*/
vector<int> v;
for (int i = 0; i < nr; i++)
v.push_back(a[stiva[i]]);
return lower_bound(v.begin(), v.end(), x) - v.begin();
}
void sol()
{
for (int i = 0; i < n; i++)
{
poz = place(a[i]);
stiva[poz] = i;
best[i] = poz + 1;
prev[i] = (poz == 0 ? -1 : stiva[poz-1]);
nr = poz + 1;
}
int maxim = 0, p = 0;
for (int i = 0; i < n; i++)
if (best[i] > maxim)
{
maxim = best[i];
p = i;
}
printf("%d\n", maxim);
afisare(p);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
citire();
sol();
return 0;
}