Pagini recente » Cod sursa (job #2756363) | Cod sursa (job #145723) | Cod sursa (job #2300169) | Cod sursa (job #2670475) | Cod sursa (job #917473)
Cod sursa(job #917473)
#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];
int solution[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);
}
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';
for (int i = poz; i >= 1; i--)
{
if (a[i] < a[poz] && scmax[i] + 1 == scmax[poz])
solution[++solution[0]] = no[poz], poz = i;
}
solution[++solution[0]] = no[poz];
for (int i = solution[0]; i >= 1; i--)
fout << solution[i] << ' ';
}