Pagini recente » Cod sursa (job #399625) | Cod sursa (job #433822) | Cod sursa (job #2502218) | Cod sursa (job #714370) | Cod sursa (job #890194)
Cod sursa(job #890194)
#include <cstdio>
const int MAX_SIZE(100001);
int n, length;
int v [MAX_SIZE];
int b [MAX_SIZE];
int p [MAX_SIZE];
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",length);
for (int i(1) ; i <= length ; ++i)
std::printf("%d ",b[i]);
std::putchar('\n');
std::fclose(stdout);
}
inline void greedy (void)
{
int i, j, l, r, m;
for (i = 1 ; i <= n ; ++i)
if (v[i] > v[b[length]] || !length)
{
p[i] = b[length];
++length;
b[length] = i;
}
else
{
l = 1;
r = length;
m = (l + r) >> 1;
while (l < r)
{
if (v[b[m]] < v[i])
l = m + 1;
else
r = m;
m = (l + r) >> 1;
}
if (v[b[m]] > v[i])
{
b[m] = i;
p[i] = b[m - 1];
}
}
for (i = b[length], j = length ; j ; --j, i = p[i])
b[j] = v[i];
}
int main (void)
{
read();
greedy();
print();
return 0;
}