Pagini recente » Cod sursa (job #1860977) | Cod sursa (job #1247696)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100000;
int binary_search(int *A, int key, int iMin, int iMax) {
if (iMax < iMin)
return 0;
int iMid;
while (iMax - iMin > 1) {
iMid = (iMax + iMin) / 2;
if (A[iMid] < key)
iMin = iMid;
else
iMax = iMid;
}
if (A[iMax] >= key)
iMax--;
return iMax;
}
int main() {
int N, i, v[NMAX];
FILE * in = fopen("scmax.in", "r");
fscanf(in, "%d", &N);
for (i = 0; i < N; i++)
fscanf(in, "%d", &v[i]);
fclose(in);
int min[N], pre[N][N];
for (i = 0; i <= N; i++)
min[i] = pre[0][i] = 0;
int L, L_max = 0;
for (i = 0; i < N; ++i) {
L = 1 + binary_search(min, v[i], 1, L_max);
if (min[L] == 0 || v[i] < min[L]) {
min[L] = v[i];
// Save the subsequence
copy(pre[L-1], pre[L-1]+L, pre[L]);
pre[L][L] = i;
if (L > L_max) L_max = L;
}
}
FILE * out = fopen("scmax.out", "w");
fprintf(out, "%d\n", L_max);
for (i = 1; i <= L_max; i++)
fprintf(out, "%d ", pre[L_max][i]);
fclose(out);
return 0;
}