Pagini recente » Cod sursa (job #2195664) | Cod sursa (job #3255583) | Cod sursa (job #599985) | Cod sursa (job #1145848) | Cod sursa (job #1787083)
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100003
using namespace std;
struct str
{
int x, y;
};
int aib[NMAX],s[NMAX], d[NMAX], v[NMAX];
bool cmp (int a, int b)
{
if (v[a] == v[b])
return a > b;
return v[a] < v[b];
}
int lsb(int x)
{
return x & (-x);
}
void update (int poz, int val)
{
while (poz <= NMAX)
{
if (d[val]> d[aib[poz]])
aib[poz] = val;
poz += lsb(poz);
}
}
int query(int poz)
{
int sol = 0;
while (poz > 0)
{
if (d[aib[poz]] > d[sol])
sol = aib[poz];
poz -= lsb(poz);
}
return sol;
}
int a[NMAX];
int p[NMAX], p_start, n;
int main ()
{
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
cin >> n;
int sol = 0;
for (int i = 1; i <= n; i++)
{
cin >> v[i];
a[i] = i;
}
sort (a + 1, a + 1 + n, cmp);
for (int i = 1; i <= n; i++)
{
p[i] = query (a[i] - 1);
d[i] = d[p[i]] + 1;
if (d[i] > sol)
{
sol = d[i];
p_start = i;
}
update (a[i], i);
}
int m = 0;
cout << sol << "\n";
while (p_start != 0)
{
m ++;
s[m] = v[a[p_start]] ;
p_start = p[p_start];
}
for (int i = m; i >= 1; i--)
cout << s[i] << " ";
return 0;
}