Pagini recente » Cod sursa (job #1613091) | Cod sursa (job #930469) | Cod sursa (job #3213631) | Cod sursa (job #40580) | Cod sursa (job #633520)
Cod sursa(job #633520)
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <map>
using namespace std;
fstream fin("scmax.in", ios::in);
fstream fout("scmax.out", ios::out);
#define MAXN 100100
#define zero(x) (x ^ (x - 1) & x)
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
int n;
int a[MAXN], b[MAXN], aib[MAXN], len[MAXN], prev[MAXN];
void normalize()
{
map<int, int> values;
sort (aib + 1, aib + n + 1);
for (int i = 1, nv = 1; i <= n; ++i) {
if (values.find(aib[i]) == values.end()) {
values[aib[i]] = nv++;
}
}
for (int i = 1; i <= n; ++i) {
b[i] = values[a[i]];
aib[i] = 0;
}
}
int query (int pos)
{
int v = 0;
while (pos > 0) {
if (len[v] < len[aib[pos]]) {
v = aib[pos];
}
pos -= zero(pos);
}
return v;
}
void update (int value, int pos)
{
while (pos <= n) {
if (len[aib[pos]] < len[value]) {
aib[pos] = value;
}
pos += zero(pos);
}
}
int main()
{
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> a[i];
aib[i] = a[i];
}
normalize ();
int maxp = 1;
for (int i = 1; i <= n; ++i) {
int j = query(b[i] - 1);
len[i] = len[j] + 1;
prev[i] = j;
update (i, b[i]);
if (len[maxp] < len[i]) {
maxp = i;
}
}
for (int i = 0, j = maxp; j; j = prev[j], ++i) {
aib[i] = a[j];
}
fout << len[maxp] << endl;
for (int i = len[maxp] - 1; i >=0; --i) {
fout << aib[i] << " ";
}
fout << endl;
fin.close();
fout.close();
return 0;
}