Pagini recente » Cod sursa (job #300210) | Cod sursa (job #2737366) | Cod sursa (job #1793121) | Cod sursa (job #1209182) | Cod sursa (job #903366)
Cod sursa(job #903366)
#include <cstdio>
const int MAX_SIZE(100001);
int v [MAX_SIZE];
int pred [MAX_SIZE];
int b [MAX_SIZE];
int n, l;
inline void read (void)
{
std::freopen("scmax.in","r",stdin);
std::scanf("%d\n",&n);
for (int i(1) ; i <= n ; ++i)
std::scanf("%d",&v[i]);
std::fclose(stdin);
}
inline void print (void)
{
std::freopen("scmax.out","w",stdout);
std::printf("%d\n",l);
for (int i(1) ; i <= l ; ++i)
std::printf("%d ",b[i]);
std::putchar('\n');
std::fclose(stdout);
}
inline void dynamic (void)
{
int i, j, middle, left, right;
b[1] = 1;
l = 1;
for (i = 2 ; i <= n; ++i)
{
if (v[i] > v[b[l]])
{
++l;
b[l] = i;
pred[i] = b[l - 1];
continue;
}
left = 1;
right = l;
middle = (left + right) >> 1;
while (left < right)
{
if (v[b[middle]] > v[i])
left = middle + 1;
else
right = middle;
middle = (left + right) >> 1;
}
if (v[b[middle]] > v[i])
{
b[middle] = i;
pred[i] = b[middle - 1];
}
}
for (j = l, i = b[l] ; i ; i = pred[i], --j)
b[j] = v[i];
}
int main (void)
{
read();
dynamic();
print();
return 0;
}