Cod sursa(job #484444)

Utilizator MKLOLDragos Ristache MKLOL Data 14 septembrie 2010 15:53:01
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<algorithm>
#include<stdio.h>

#define Nmax 101010

using namespace std;

int AIB[Nmax],AIB2[Nmax],best[Nmax],pre[Nmax],maxim,ifin,p[Nmax];
int N,num;
struct cel
{
    int nr,ind,x;
}l[Nmax];
int zeros(int x)
{
return ((x ^ (x - 1)) & x );
}

void Add(int x, int q,int nr)
{
    int i;

    for (i = x; i <= N; i += zeros(i))
        if(AIB[i]<q)
        {
            AIB[i]=q;
            AIB2[i]=nr;
        }
}

int comp(int x)
{
    int i, ret = 0;

    for (i = x; i > 0; i -= zeros(i))
        ret =max(AIB[i],ret);
    return ret;
}
int prepro(int x)
{
    int i,real=0, ret = 0;

    for (i = x; i > 0; i -= zeros(i))
        if(ret<AIB[i])
        {
            ret=AIB[i];
            real=AIB2[i];
        }
    return real;
}
int cmp(cel a,cel b)
{
    return a.nr<b.nr;
}
void recur(int x)
{
    if(x==0)
    return;
    if(x)
    {
        recur(pre[x]);
        printf("%d ",p[x]);
        return;
    }

}
int main()
{
	freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
	scanf("%d",&N);
	for(int i=1;i<=N;++i)
	{
    scanf("%d",&l[i].nr);

	l[i].ind=i;
	l[i].x=l[i].nr;
	p[i]=l[i].nr;
	}
	sort(l+1,l+N+1,cmp);
    num=1;
    for(int i=1;i<=N;++i)
    {
        l[l[i].ind].x=num;
        if(l[i].nr!=l[i+1].nr)
        ++num;
    }

   //  for(int i=1;i<=N;++i)
    //    printf("%d ",l[i].x);

    for(int i=1;i<=N;++i)
    {
    best[i]=1;
    best[i]=max(comp(l[i].x-1)+1,best[i]);
    pre[i]=prepro(l[i].x);
    Add(l[i].x,best[i],i);
    if(best[i]>maxim)
    {
        maxim=best[i];
        ifin=i;
    }
    }

    printf("%d\n",maxim);
    recur(ifin);
 //  for(int i=1;i<=N;++i)
   //    printf("%d ",best[i]);

}