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