Cod sursa(job #779153)

Utilizator crushackPopescu Silviu crushack Data 16 august 2012 20:12:59
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <algorithm>
#define zeros(x) (x&(x-1)^x)
#define NMax 100010
using namespace std;

const char IN[]="scmax.in",OUT[]="scmax.out";

int N,L,father,Rez,PRez;
int v[NMax],v2[NMax],T[NMax],P[NMax],arb[NMax],parb[NMax];

void update(int x,int val,int poz){
	for (;x<=L;x+=zeros(x))
		if (val>arb[x])
			arb[x]=val,parb[x]=poz;
}

int query(int x){
	int ret=0;father=0;
	for (;x>0;x-=zeros(x))
		if (arb[x]>ret)
			ret=arb[x],father=parb[x];
	return ret;
}

int search(int x){
	int i,step;
	for (step=1;step<=L;step<<=1);
	for (i=0;step;step>>=1)
		if (i+step<=L && v2[i+step]<=x)
			i+=step;
	return i;
}

void write(int x){
	if (!x) return;
	write(P[x]);
	printf("%d ",v[x]);
}

int main()
{
	int i,x;
	freopen(IN,"r",stdin);
	scanf("%d",&N);
	for (i=1;i<=N;++i) scanf("%d",v+i),v2[i]=v[i];
	fclose(stdin);

	sort(v2+1,v2+N+1);
	L=unique(v2+1,v2+N+1)-v2-1;

	for (i=1;i<=N;++i)
	{
		T[i]=query((x=(search(v[i])))-1)+1;P[i]=father;
		update(x,T[i],i);
		if (T[i]>Rez) Rez=T[i],PRez=i;
	}

	freopen(OUT,"w",stdout);
	printf("%d\n",Rez);
	write(PRez);
	fclose(stdout);

	return 0;
}