Pagini recente » Cod sursa (job #2360591) | Cod sursa (job #2422522) | Cod sursa (job #1262677) | Cod sursa (job #1141140) | Cod sursa (job #2627043)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
FILE *fin = fopen("scmax.in", "r");
FILE *fout = fopen("scmax.out", "w");
FILE *aux = fopen("sir1.out", "w");
int n, a[100000], max, start;
fscanf(fin, "%d", &n);
for(int i = 0; i < n; i++)
fscanf(fin, "%d", &a[i]);
int *D = malloc(n * sizeof(int));
int *P = malloc(n * sizeof(int));
int size = 0;
D[size++] = a[0];
P[0] = 1;
for(int i = 1; i < n; i++){
if(a[i] > D[size - 1]){
D[size++] = a[i];
P[i] = size;
}
else{
int lt = 0, rt = size - 1, poz;
while(lt <= rt){
int mid = (lt + rt) / 2;
if(D[mid] >= a[i]){
poz = mid;
rt = mid - 1;
}
else lt = mid + 1;
}
D[poz] = a[i];
P[i] = poz + 1;
}
}
max = 0;
for(int i = 0; i < n; i++)
if(P[i] > max){
max = P[i];
start = i;
}
int *ans = malloc(max * sizeof(int));
ans[--max] = a[start];
while(max){
for(int i = 0; i < start; i++)
if(P[i] == P[start] - 1 && a[i] < a[start]){
ans[--max] = a[i];
start = i;
break;
}
}
fprintf(fout, "%d\n", size);
for(int i = 0; i < size; i++)
fprintf(fout, "%d ", ans[i]);
fprintf(fout, "\n");
free(ans);
free(D);
free(P);
fclose(fin);
fclose(fout);
}