Pagini recente » Cod sursa (job #270604) | Cod sursa (job #2499507) | Cod sursa (job #2185341) | Cod sursa (job #2848594) | Cod sursa (job #525960)
Cod sursa(job #525960)
#include <cstdio>
using namespace std;
void printSol(int* pred, int *a, int pos);
int binSearch(int *a, int *lengths, int low, int high, int key);
int main(void)
{
int N, i, j, maxLen;
int *a, *lengths, *pred;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&N);
a = new int[N];
lengths = new int[N];
pred = new int[N];
for (i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
pred[0] = -1;
maxLen = 1;
lengths[0] = 0;
for (i=1;i<N;i++)
{
int bsResult = binSearch(a,lengths,0,maxLen-1,i);
lengths[bsResult] = i;
if (bsResult == 0)
{
pred[i] = -1;
}
else
{
pred[i] = lengths[bsResult-1];
if (bsResult == maxLen)
{
maxLen++;
}
}
}
printf("%d\n",maxLen);
printSol(pred,a,lengths[maxLen-1]);
printf("\n");
delete[] a;
delete[] lengths;
delete[] pred;
return 0;
}
void printSol(int* pred, int *a, int pos)
{
if (pred[pos] != -1)
{
printSol(pred,a,pred[pos]);
}
printf("%d ",a[pos]);
}
int binSearch(int *a, int *lengths, int low, int high, int key)
{
int mid;
while (low <= high)
{
mid = low + (high-low)/2;
if (a[lengths[mid]] < a[key])
{
low = mid+1;
}
else high = mid-1;
}
return low;
}