Pagini recente » Cod sursa (job #1684939) | Cod sursa (job #616568) | Cod sursa (job #787766) | Cod sursa (job #2959211) | Cod sursa (job #2291372)
#include <cstdio>
using namespace std;
int binarySearch(int arr[], int l, int r, int x, int n)
{
if (r >= l)
{
int mid = l + (r - l)/2;
if(mid != n)
{
if (arr[mid] > x && arr[mid+1] <= x)
return mid;
}
else if (arr[mid] > x)
return mid;
if (arr[mid] < x)
return binarySearch(arr, l, mid-1, x, n);
return binarySearch(arr, mid+1, r, x, n);
}
return -1;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n, v[100002], best[100002], r[100002], maxim;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &v[i]);
best[n-1]=1;
r[1] = v[n - 1];
maxim = 1;
for(int i = n - 2; i >= 0; i--)
{
int x = binarySearch(r, 1, maxim, v[i], maxim);
if(x == -1)
{
best[i] = 1;
if(r[1] < v[i])
r[1] = v[i];
}
else{
best[i] = x + 1;
r[x + 1] = v[i];
if(x + 1 > maxim)
maxim = x + 1;
}
}
printf("%d\n", maxim);
int x, y;
for(int i = 0; i < n; i++)
{
if(v[i] == r[maxim] && best[i] == maxim)
{
printf("%d ", v[i]);
x = v[i];
y = best[i];
}
if(v[i] > x && best[i] == y-1)
{
printf("%d ", v[i]);
x = v[i];
y = best[i];
}
}
return 0;
}