Pagini recente » Cod sursa (job #2597180) | Cod sursa (job #3246941) | Cod sursa (job #839654) | Cod sursa (job #2930859) | Cod sursa (job #1803853)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
#define MAX 100000
int l[MAX + 1], n, lmax, ind, rez[MAX + 1], sum, sumind, lind;
struct scmax
{
int x, ind, l, bef;
}a[MAX + 1];
struct abc
{
int a, ind;
}aib[MAX + 1];
bool cmp(scmax A, scmax B)
{
if (A.x < B.x)return true;
else if (A.x == B.x && A.ind < B.ind)return true;
else return false;
}
void update (int x, int valind)
{
for (int i = x; i <= n; i+= (i&-i))
if (aib[i].a < a[valind].l)aib[i].a = a[valind].l, aib[i].ind = valind;
}
void query (int x)
{
for (int i = x; i >= 1; i -= (i&-i))
if (aib[i].a + 1 > sum)sum = aib[i].a + 1, sumind = aib[i].ind;
}
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)fin >> a[i].x, a[i].ind = i;
sort(a + 1, a + 1 + n, cmp);
for (int i = 1; i <= n; i++)
{
if (a[i].x != a[i -1].x)
{
sum = 0;
sumind = -1;
query(a[i].ind);
a[i].l = sum;
a[i].bef = sumind;
update(a[i].ind, i);
if (a[i].l > lmax)lmax = a[i].l, lind = i;
}
}
fout << lmax << '\n';
while (a[lind].x > 0)
{
rez[++rez[0]] = a[lind].x;
lind = a[lind].bef;
}
for (int i = rez[0]; i >= 1; i--)fout << rez[i] << ' ';
return 0;
}