Cod sursa(job #1459961)

Utilizator ArkinyStoica Alex Arkiny Data 11 iulie 2015 13:12:01
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

#define MAX 100001



int AIB[MAX],up[MAX],lst[MAX],v[MAX],R[MAX],N,D[MAX];

int query(int x)
{
	int max=0;
	for(;x;x-=x&(-x))
		if(D[AIB[x]]>D[max])
			max=AIB[x];
	return max;
}
void update(int x,int ind)
{
   for(;x<=N;x+=x&(-x))
	   if(D[AIB[x]]<D[ind])
		   AIB[x]=ind;
}
int main()
{
	FILE *in;
	FILE *out;

	in=fopen("scmax.in","r");
	out=fopen("scmax.out","w");

	fscanf(in,"%d",&N);
	for(int i=1;i<=N;i++)
		fscanf(in,"%d",&lst[i]),R[i]=lst[i];
	stable_sort(lst+1,lst+N+1);
	int h=1;
	for(int i=2;i<=N;i++)
		if(lst[i]!=lst[h])
			lst[++h]=lst[i];
	for(int i=1;i<=N;i++)
		v[i]=lower_bound(lst +1,lst +h+1,R[i]) - lst;

		
	int max=0;
	int p=0;
	for(int i=1;i<=N;i++)
	{
		up[i]=query(v[i]-1);
		D[i]=D[up[i]]+1;
		if(D[i]>p)
			p=D[i],max=i;
		update(v[i],i);
	}
	h=0;
	fprintf(out,"%d\n",D[max]);
	for(int i=max;i;i=up[i])
		lst[++h]=R[i];
	for(int i=h;i>0;i--)
		fprintf(out,"%d ",lst[i]);
	return 0;
}