Pagini recente » Cod sursa (job #634913) | Cod sursa (job #23602) | Cod sursa (job #2684290) | Cod sursa (job #2418248) | Cod sursa (job #1106292)
#include <iostream>
#include <fstream>
using namespace std;
#define MAXN 100005
ifstream f("scmax.in");
ofstream g("scmax.out");
int n;
int v[MAXN];
int maxl, maxp;
int prrev[MAXN];
int len[MAXN];
int aux[MAXN];
int search(int x) {
int st = 0, dr = maxl;
while (st <= dr) {
int mdl = st + ((dr - st) >> 1);
if (v[aux[mdl]] < x && x <= v[aux[mdl + 1]]) {
return mdl;
} else if (v[aux[mdl]] < x) {
st = mdl + 1;
} else {
dr = mdl - 1;
}
}
return maxl;
}
void remake(int nd) {
if (nd == 0) {
return;
}
remake(prrev[nd]);
g << v[nd] << ' ';
}
int main()
{
f >> n;
for (int i = 1; i <= n; i++) {
f >> v[i];
}
maxl = 1;
aux[1] = 1;
aux[0] = 0;
len[1] = 1;
for (int i = 2; i <= n; i++) {
int pos = search(v[i]);
prrev[i] = aux[pos];
len[i] = pos + 1;
aux[pos + 1] = i;
maxl = max(maxl, len[i]);
if (len[maxp] < len[i]) {
maxp = i;
}
}
g << maxl << endl;
remake(maxp);
return 0;
}