Pagini recente » Cod sursa (job #2909156) | Cod sursa (job #2679467) | Cod sursa (job #305077) | Cod sursa (job #354685) | Cod sursa (job #3173621)
#include <bits/stdc++.h>
#define N_MAX 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int AIB[N_MAX];
int a[N_MAX], b[N_MAX], copie[N_MAX];
int recon[N_MAX], retrace[N_MAX];
int n;
void update(int x, int p)
{
for (int i = x; i <= n; i += (i & (-i)))
AIB[i] += p;
}
int query(int x)
{
int rez = 0;
for (int i = x; i; i -= (i & (-i)))
rez += AIB[i];
return rez;
}
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)
{
int x;
fin >> x;
a[i] = b[i] = copie[i] = x;
}
/// normalizare
sort(copie + 1, copie + n + 1);
int x = 0;
for (int i = 1; i <= n; i++)
{
if (copie[x] != copie[i])
copie[++x] = copie[i];
}
for (int i = 1; i <= n; i++)
{
b[i] = lower_bound(copie + 1, copie + x + 1, b[i]) - copie;
}
for (int i = 1; i <= n; i++)
{
retrace[i] = query(b[i] - 1);
recon[i] = recon[retrace[i]] + 1;
update(b[i], i);
}
int ultimul = 0;
for (int i = 1; i <= n; i++)
if (recon[ultimul] < recon[i])
ultimul = i;
int j;
for (j = 0; ultimul; ultimul = retrace[ultimul])
{
copie[++j] = a[ultimul];
}
fout << j << '\n';
for (; j; j--)
{
fout << copie[j] << " ";
}
}