Pagini recente » Cod sursa (job #1357880) | Cod sursa (job #1630511) | Monitorul de evaluare | Cod sursa (job #1357869) | Cod sursa (job #2505449)
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int k, n, v[NMAX + 1], best[NMAX + 1], maxim = 0, lis[NMAX + 1], i, index;
int binary_s(int x) {
int l = 0, r = lis[i - 1];
while(l <= r) {
int m = (l + r) / 2;
if(best[m] < x && best[m + 1] >= x)
return m + 1;
else if(best[m] < x)
l = m + 1;
else
r = m - 1;
}
k++;
return k;
}
void afis(int i) {
if(lis[i] == 1)
fout << v[i] << " ";
else {
int j = i - 1;
while(lis[i] == lis[j])
j--;
afis(j);
fout << v[i] << " ";
}
}
int main() {
fin >> n;
k = 0;
for(i = 1; i <= n; i++) {
fin >> v[i];
int poz = binary_s(v[i]);
lis[i] = poz;
if(maxim < lis[i])
maxim = lis[i], index = i;
best[poz] = v[i];
}
fout << maxim<<endl;
afis(index);
return 0;
}