Pagini recente » Cod sursa (job #1170341) | Cod sursa (job #308232) | Cod sursa (job #2130882) | Cod sursa (job #2639853) | Cod sursa (job #2153229)
#include <algorithm>
#include <vector>
#include <cstdlib>
using namespace std;
const int DIM = 100010;
int aib[DIM];
int n, v[DIM], dp[DIM];
pair <int, int> a[DIM];
pair <int, int> b[DIM];
int elmax = -1;
int Max = -1;
int sol[DIM];
void Read()
{
scanf("%d", &n);
for (int i = 1;i <= n;++i)
scanf("%d", &v[i]);
}
void Normalizare()
{
for (int i = 1;i <= n;++i)
a[i] = make_pair(v[i], i);
sort(a + 1, a + n + 1);
int val = 0;
a[0].first = -1;
for (int i = 1;i <= n;++i)
{
if (a[i].first != a[i - 1].first)
b[i] = make_pair(a[i].second, ++val);
else
b[i] = make_pair(a[i].second, val);
}
elmax = val;
sort(b + 1, b + n + 1);
}
void Update(int pos, int val)
{
for (int i = pos;i <= elmax;i += (i & (-i)))
aib[i] = max(aib[i], val);
}
int Query(int val)
{
int ret = 0;
for (int i = val;i >= 1;i -= (i & (-i)))
ret = max(ret, aib[i]);
return ret;
}
void Solve()
{
for (int i = 1;i <= n;++i)
{
dp[i] = 1 + Query(b[i].second - 1);
Update(b[i].second, dp[i]);
}
int x = -1;
for (int i = 1;i <= n;++i)
x = max(x, dp[i]);
sol[0] = x;
for (int i = n;i >= 1;--i)
{
if (x == dp[i])
{
sol[x] = v[i];
--x;
}
}
}
void Write()
{
printf("%d\n", sol[0]);
for (int i = 1;i <= sol[0];++i)
printf("%d ", sol[i]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
Read();
Normalizare();
Solve();
Write();
return 0;
}