Pagini recente » Cod sursa (job #805978) | Cod sursa (job #1264563) | Cod sursa (job #2800362) | Cod sursa (job #376627) | Cod sursa (job #917467)
Cod sursa(job #917467)
#include <algorithm>
#include <iostream>
#include <fstream>
#define NMAX 100100
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, sol, poz;
int a[NMAX], v[NMAX], no[NMAX];
int aib[NMAX], scmax[NMAX];
inline int bsNorm(int left, int right, int number)
{
if (left == right) return left;
int mid = (left + right) >> 1;
if (number <= v[mid]) return bsNorm(left, mid, number);
if (number > v[mid]) return bsNorm(mid + 1, right, number);
}
inline int query(int value)
{
int ret = 0;
for (int i = value; i >= 1; i = i & (i - 1))
ret = max(ret, aib[i]);
return ret;
}
inline void update(int position, int value)
{
for (int i = position; i <= NMAX; i = (i | (i - 1)) + 1)
aib[i] = max(aib[i], value);
}
inline void makeSol(int position)
{
for (int i = position; i >= 1; i--)
if (a[i] < a[position] && scmax[i] + 1 == scmax[position])
{
makeSol(i);
break;
}
fout << no[position] << ' ';
}
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)
fin >> a[i], v[i] = a[i], no[i] = a[i];
sort(v + 1, v + n + 1);
for (int i = 1; i <= n; i++)
a[i] = bsNorm(1, n, a[i]);
for (int i = 1; i <= n; i++)
{
scmax[i] = query(a[i] - 1) + 1;
update(a[i], scmax[i]);
if (sol < scmax[i])
sol = scmax[i], poz = i;
}
fout << sol << '\n';
makeSol(poz);
}