Pagini recente » Cod sursa (job #675518) | Cod sursa (job #1027244) | Cod sursa (job #317129) | Cod sursa (job #2275344) | Cod sursa (job #764885)
Cod sursa(job #764885)
#include <stdio.h>
int subseqLen[100001][2], seq[100001], predecessor[100001], N, maxLen, maxPos;
FILE *in, *out;
void printSeq(int k)
{
if(predecessor[k])
printSeq(predecessor[k]);
fprintf(out, "%d ", seq[k]);
}
int main()
{
int i, best, l, r, middle;
/*reading the input*/
in = fopen("scmax.in", "r");
fscanf(in, "%d", &N);
for(i = 0; i < N; i++)
fscanf(in, "%d", &seq[i]);
fclose(in);
/*done reading the input*/
for(i = 0; i < N; i++)
{
l = 0;
r = maxLen + 1;
while(l + 1 < r)
{
middle = (r - l) / 2 + l;
if(subseqLen[middle][0] < seq[i])
l = middle;
else
r = middle;
}
best = l;
predecessor[i] = subseqLen[best][1];
if(best == maxLen)
{
subseqLen[++maxLen][0] = seq[i];
subseqLen[maxLen][1] = i;
maxPos = i;
}
else if(subseqLen[++best][0] > seq[i])
{
subseqLen[best][0] = seq[i];
subseqLen[best][1] = i;
}
}
/*writing the output*/
out = fopen("scmax.out", "w");
fprintf(out, "%d\n", maxLen);
printSeq( maxPos );
fprintf(out, "\n");
fclose(out);
return 0;
}