Pagini recente » Cod sursa (job #237786) | Cod sursa (job #2405464) | Cod sursa (job #1516128) | Cod sursa (job #1836480) | Cod sursa (job #1379789)
#include <cstdio>
#include <algorithm>
#define ub(x) (x&(-x))
#define Nmax 100010
#define val first
#define poz second
using namespace std;
int n , i , sol , F , crt;
int best[Nmax] , copie[Nmax] , start[Nmax] , SOL[Nmax];
pair < int , int > aib[Nmax] , a[Nmax];
void update(int x , int b)
{
for (int i = x; i <= n; i += ub(i))
if (aib[i].val < b)
aib[i].val = b , aib[i].poz = x;
}
int inter(int x , int &inceput)
{
int i , sol = 0;
for (i = x; i >= 1; i -= ub(i))
if (sol < aib[i].val)
sol = aib[i].val , inceput = aib[i].poz;
return sol;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for (i=1;i<=n;i++)
{
scanf("%d", &a[i].val);
a[i].poz = i;
copie[i] = a[i].val;
}
sort(a + 1 , a + n + 1);
for (i = 1; i <= n; ++i)
if (a[i].val != a[i-1].val)
{
best[i] = inter(a[i].poz - 1 , start[i]) + 1;
update(a[i].poz , best[i]);
}
else copie[a[i].poz] = -1;
for (i = 1; i <= n; ++i)
if (sol < best[i])
sol = best[i] , F = a[i].poz;
printf("%d\n", sol);
crt = 0;
for (i = F; crt < sol; --i)
if (copie[i] != -1)
{
SOL[++SOL[0]] = copie[i];
crt++;
}
for (i = SOL[0]; i >= 1; --i)
printf("%d ", SOL[i]);
return 0;
}