Pagini recente » Cod sursa (job #2409335) | Cod sursa (job #456347) | Cod sursa (job #940371) | Cod sursa (job #514176) | Cod sursa (job #2506815)
#include <iostream>
#include <cstdio>
#include <vector>
#define NMAX 100000
using namespace std;
struct elem {
int val, index;
} best[NMAX + 5];;
int n, top;
int v[NMAX + 5], nr[NMAX + 5];
int bs(int x) {
if(best[top].val < x)
return top;
int st, dr, mij, last = 0;
st = 1;
dr = top;
while(st <= dr) {
mij = (st + dr) / 2;
if(best[mij].val < x) {
last = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
return last;
}
void find_path(int poz) {
if(v[poz] == 0) {
printf("%d ", nr[poz]);
return;
}
find_path(v[poz]);
printf("%d ", nr[poz]);
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int x, poz;
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &x);
nr[i] = x;
poz = bs(x);
if(poz == top) {
best[++top].val = x;
best[top].index = i;
v[i] = best[top - 1].index;
}
else {
best[poz + 1].val = x;
best[poz + 1].index = i;
v[i] = best[poz].index;
}
}
printf("%d\n", top);
find_path(best[top].index);
return 0;
}