Pagini recente » Cod sursa (job #616054) | Cod sursa (job #3138648) | Cod sursa (job #652942) | Cod sursa (job #652191) | Cod sursa (job #676739)
Cod sursa(job #676739)
#include <cstdio>
const int N_MAX = 100010;
int v[N_MAX],n;
int p[N_MAX]; int l_max=0; //p[i] -> pozitia din vectorul v pe care se termina o subsecventa de lungime i; l_max dimensiunea lui p
int pred[N_MAX];
inline int max(int a, int b)
{
return a>b?a:b;
}
void citeste()
{
scanf("%d",&n);
for (int i = 1; i <= n; ++i)
scanf("%d",&v[i]);
}
int cautare_binara(int i)
{
int poz = 0;
for (int pas = 1<<17; pas > 0; pas >>= 1)
if (poz + pas <= l_max && v[p[poz+pas]] < v[i]) //strict crescator
poz += pas;
return poz;
}
void scmax()
{
//p[0] = 0; v[0] = 0;
int l;
for (int i = 1; i <= n; ++i)
{
l = cautare_binara(i);
pred[i] = p[l];
p[l+1] = i;
l_max = max(l_max,l+1);
}
}
void scrie_subsir(int i)
{
if (pred[i] != 0)
scrie_subsir(pred[i]);
printf("%d ",v[i]);
}
void scrie()
{
printf("%d\n",l_max);
scrie_subsir(p[l_max]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
citeste();
scmax();
scrie();
return 0;
}