Pagini recente » Cod sursa (job #481646) | Cod sursa (job #1548533) | Cod sursa (job #1298527) | Cod sursa (job #407414) | Cod sursa (job #2236162)
#include <cstdio>
#include <vector>
FILE *fin = freopen("scmax.in","r",stdin); FILE *fout = freopen("scmax.out","w",stdout);
static const int MAX_N = 1e5 + 5;
/* ========= DATA ========= */
int n, size;
int a[MAX_N], index[MAX_N], prev[MAX_N];
/* ========= DATA ========= */
void Read_Input()
{
scanf("%d",&n);
for(int i = 1; i<=n ;++i)
scanf("%d",&a[i]);
}
void ConstructSubstring()
{
int sol= 0;
for(int i = 1; i<= n; ++i)
{
if(a[i] > a[index[size]])
{
index[++size]=i;
prev[i] = index[size-1];
}
else
{
int left =1 , right = size, mid;
while(left<=right)
{
mid = (left+right) >> 1;
if(a[i] <= a[index[mid]])
{
sol = mid;
right = mid - 1;
}
else
left = mid + 1;
}
index[sol] = i;
prev[i] = index[sol-1];
}
}
}
void PrintSolution()
{
std::vector<int> v;
int x = index[size];
while(x)
{
v.push_back(a[x]);
x = prev[x];
}
printf("%d\n",size);
for(int i = (int) v.size() -1; i>= 0; i--)
printf("%d ", v[i]);
}
int main()
{
Read_Input();
ConstructSubstring();
PrintSolution();
return 0;
}