Pagini recente » Cod sursa (job #2177575) | Cod sursa (job #1316029) | Cod sursa (job #1705114) | Rating Muntean Natan (eden001) | Cod sursa (job #2177627)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int N, lg, l[100003], V[100003], father[100003], sol[100003];
int bsearch(int V[], int N, int val) {
int ans, log;
for (log = 1; log < N; log <<= 1);
for (ans = N; log; log >>= 1) {
if (ans - log > 0 && V[ans - log] > val) {
ans -= log;
}
}
if (V[ans] < val) {
++ans;
}
return ans;
}
int main() {
fin >> N;
for (int i = 1; i <= N; ++i)
fin >> V[i];
l[1] = V[1];
father[1] = 1;
lg = 1;
for (int i = 2; i <= N; ++i)
{
// int poz = upper_bound(l + 1, l + lg + 1, V[i]) - l;
int poz = bsearch(l, lg, V[i]);
if (l[poz - 1] == V[i])
--poz;
l[poz] = V[i];
father[i] = poz;
lg = max(lg, poz);
}
int l2 = lg;
fout << lg << '\n';
for (int i = N; i; --i)
if (father[i] == l2)
{
sol[l2--] = i;
}
for (int i = 1; i <= lg; ++i)
fout << V[sol[i]] << ' ';
fout << '\n';
return 0;
}