Pagini recente » Cod sursa (job #2836584) | Cod sursa (job #666505) | Cod sursa (job #1879371) | Cod sursa (job #1979635) | Cod sursa (job #2696359)
#include <cstdio>
#include <iostream>
using namespace std;
#define MAX_LENGTH 100000
#define MAX_LENGTH_BITS 16
int Array[MAX_LENGTH], MinEnding[MAX_LENGTH], PreviousIndex[MAX_LENGTH];
int BinarySearch(int target, int low, int high){
int i=low-1, step=1<<MAX_LENGTH_BITS;
while (step){
if (step+i<=high && Array[MinEnding[i+step]]<target){
i+=step;
}
step>>=1;
}
return i;
}
FILE *fout;
void PrintPath(int index){
if (index==-1) return;
PrintPath(PreviousIndex[index]);
fprintf(fout, "%d ", Array[index]);
}
int main()
{
FILE *fin=fopen("scmax.in", "r");
int length;
fscanf(fin, "%d", &length);
int i;
for (i=0; i<length; i++){
fscanf(fin, "%d", &Array[i]);
}
fclose(fin);
int subArrayLength, maxLength=0;
for (i=0; i<length; i++){
//printf("i=%d\n", i);
subArrayLength=BinarySearch(Array[i], 0, maxLength-1)+1;
MinEnding[subArrayLength]=i;
if (subArrayLength>0) PreviousIndex[i]=MinEnding[subArrayLength-1];
else PreviousIndex[i]=-1;
maxLength=max(maxLength, subArrayLength+1);
}
fout=fopen("scmax.out", "w");
fprintf(fout, "%d\n", maxLength);
PrintPath(MinEnding[maxLength-1]);
fclose(fout);
return 0;
}