Pagini recente » Cod sursa (job #896515) | Cod sursa (job #2405107) | Cod sursa (job #3249367) | Cod sursa (job #3165715) | Cod sursa (job #2418311)
#include <stdio.h>
#define NMAX 100000
#define INFINIT 2000000001
int scm[ 1 + NMAX ] ;
int s[ 1 + NMAX ] ;
int poz[ 1 + NMAX ] ;
int last[ NMAX + 1 ] ;
int v[ NMAX + 1 ] ;
int rez[ NMAX + 1 ] ;
int bs (int st, int dr, int val) {
int mid;
dr++;
while(dr - st > 1) {
mid = (st + dr) / 2;
if(s[mid] < val)
st = mid;
else
dr = mid;
}
return st;
}
int main() {
FILE *fin = fopen("scmax.in", "r") ;
FILE *fout = fopen("scmax.out", "w") ;
int n, maxim, i, pozmax, j;
fscanf(fin, "%d", &n);
for(i = 0 ; i < n ; i++ ) {
s[i] = INFINIT ;
poz[i] = -1 ;
}
maxim = 0;
pozmax = 0;
for(i = 0 ; i < n ; i++ ) {
fscanf(fin, "%d", &v[i]) ;
scm[i] = bs(0 , maxim, v[i]) + 1 ;
last[i] = poz[ scm[i] - 1 ];
if( scm[i] > maxim ) {
maxim = scm[i];
pozmax = i;
}
if( v[i] < s[scm[i]] ) {
s[scm[i]] = v[i];
poz[scm[i]] = i;
}
}
i = pozmax ;
j = maxim - 1 ;
while( i >= 0 ) {
rez[j] = v[i];
i = last[i];
j--;
}
fprintf(fout, "%d\n", maxim);
for(i = 0; i < maxim; i++)
fprintf(fout, "%d ", rez[i]);
fclose(fin);
fclose(fout);
return 0;
}