Pagini recente » Borderou de evaluare (job #3366507) | Cod sursa (job #3366489) | Cod sursa (job #3366814) | Cod sursa (job #3367500) | Cod sursa (job #3366507)
#include <stdio.h>
#define N 100000
const int INF = 2e9 + 1;
int v[N], lung[N], val_min[N+1];
int max(int x, int y) {
return (x > y ? x : y);
}
void refac_subsirul(FILE *fout, int poz, int lungime, int val) {
if (lungime == 0) {
return;
}
if (v[poz] < val && lung[poz] == lungime) {
refac_subsirul(fout, poz - 1, lungime - 1, v[poz]);
fprintf(fout, "%d ", v[poz]);
} else {
refac_subsirul(fout, poz - 1, lungime, val);
}
}
int caut_bin(int x[], int st, int dr, int val) {
// cautam binar cel mai mare j_0 cu x[j_0] < val
int j_0 = 0;
while (st <= dr) {
int m = (st + dr) / 2;
if (x[m] < val) {
j_0 = m;
st = m + 1;
} else {
dr = m - 1;
}
}
return j_0;
}
int main(void) {
FILE *fin = fopen("scmax.in", "r");
int n;
fscanf(fin, "%d", &n);
int p_lung_max = 0, lung_max = 0;
for (int i = 0; i < n; i++) {
fscanf(fin, "%d", &v[i]);
int max_lung_i = caut_bin(val_min, 1, lung_max, v[i]);
lung[i] = 1 + max_lung_i;
val_min[1 + max_lung_i] = v[i];
if (lung[i] > lung_max) {
p_lung_max = i;
lung_max = lung[i];
}
}
fclose(fin);
FILE *fout = fopen("scmax.out", "w");
fprintf(fout, "%d\n", lung[p_lung_max]);
refac_subsirul(fout, p_lung_max, lung[p_lung_max], INF);
fprintf(fout, "\n");
fclose(fout);
return 0;
}