Pagini recente » Cod sursa (job #1080032) | Cod sursa (job #1402533) | Cod sursa (job #479655) | Cod sursa (job #208663) | Cod sursa (job #633696)
Cod sursa(job #633696)
#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, nr;
int a[MAXN], len[MAXN], prev[MAXN], tata[MAXN];
int query (int p)
{
int beg = 0, end = nr;
while (beg <= end) {
int mdl = beg + ((end - beg) >> 1);
if (a[tata[mdl]] < p && p <= a[tata[mdl + 1]]) {
return mdl;
}
if (a[tata[mdl + 1]] < p) {
beg = mdl + 1;
} else {
end = mdl - 1;
}
}
return nr;
}
void recover (int i)
{
if (prev[i] > 0) {
recover(prev[i]);
}
fout << a[i] << " ";
}
int main()
{
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> a[i];
}
len[1] = 1, tata[1] = 1, tata[0] = 0, nr = 1;
int maxp = 1;
for (int i = 2; i <= n; ++i) {
int j = query (a[i]);
len[i] = j + 1;
prev[i] = tata[j];
tata[j + 1] = i;
nr = max(j + 1, nr);
if (len[i] > len[maxp]) {
maxp = i;
}
}
fout << len[maxp] << endl;
recover(maxp);
fin.close();
fout.close();
return 0;
}