Cod sursa(job #627960)
#include<cstdio>
#include<vector>
FILE *in = fopen ("scmax.in", "r"), *out = fopen ("scmax.out", "w");
using namespace std;
vector <int> sir(100001), prec(100001), M(100001, 0);
void Afiseaza(int poz){
if (prec[poz] == poz) return;
Afiseaza(prec[poz]);
fprintf(out, "%d ", sir[poz]);
}
int CautaMax(int maxPoz, int maxVal)
{
int st = 1, dr = maxPoz, m;
while (st <= dr)
{
m = (st + dr) / 2;
if (maxVal <= sir[M[m]]) dr = m-1;
else st = m+1;
}
return st - 1;
}
int main(){
int n, i, j, Maxim = 0, P;
fscanf(in, "%d", &n);
for (i = 1; i <= n; i++){
fscanf(in, "%d", &sir[i]);
prec[i] = i;
}
for (i = 1; i <= n; i++){
j = CautaMax(Maxim, sir[i]);
if (j == Maxim || sir[i] < sir[M[j+1]]){
if (j+1 > Maxim) {Maxim = j+1; P = i;}
M[j+1] = i;
prec[i] = M[j];
}
}
fprintf(out, "%d\n", Maxim);
Afiseaza(P);
return 0;
}