Cod sursa(job #667767)

Utilizator timeiutzaTimea Balan timeiutza Data 23 ianuarie 2012 18:49:49
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
using namespace std;
const int N_MAX = 100010;
const int INF = 2000000010;
int v[N_MAX]; int n;
int p[N_MAX]; int l_max = 0;
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<<20; pas > 0; pas >>= 1)
if (poz + pas <= l_max && v[p[poz+pas]] < v[i])
poz += pas;.
return poz;
}
void scmax()
{
int l;
v[0] = INF; //cand ma aflu pe o lungime ce nu exista, p[l] = 0 si INF este suficient de mare
for (int i = 1; i <= n; ++i)
{
l = cautare_binara(i);
if (v[p[l+1]] >= v[i])
{
p[l+1] = i;
l_max = max(l_max,l+1);
pred[i] = p[l];
}
}
}
void scrie_subsir(int poz)
{
if (pred[poz] != 0)
scrie_subsir(pred[poz]);
printf("%d ",v[poz]);
}
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;
}