Cod sursa(job #485921)

Utilizator cosmyoPaunel Cosmin cosmyo Data 19 septembrie 2010 21:55:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<algorithm>
#include<fstream.h>
using namespace std;
const int NMAX=100005;
int n,a[NMAX],d[NMAX],aib[NMAX],x[NMAX],sol[NMAX],y[NMAX];
int querry(int x)
{int mx=0; 
  for(;x;x-=x&(x-1)^x)
	if(d[aib[x]]>d[mx])
		mx=aib[x];
 return mx;
}
void update(int x,int ind)
{ for(;x<=n;x+=x&(x-1)^x)
	if(d[ind]>d[aib[x]])
		aib[x]=ind;
}
ofstream fout("scmax.out");

void afis(int p)
{if(p)
	{afis(sol[p]);
     fout<<x[a[p]]<<' ';
	}
}
int main()
{ifstream fin("scmax.in");
   fin>>n;
  int i,m=0;
	  for(i=1;i<=n;++i)
		  {fin>>a[i];x[i]=a[i];}
 
 sort(x+1,x+n+1);
 
 for(i=1;i<=n;++i)
	 if(x[i]!=x[i+1])
		 x[++m]=x[i];
 
  for(i=1;i<=n;++i)
	 a[i]=lower_bound(x+1,x+n+1,a[i])-x;
 
 for(i=1;i<=n;++i)
 {sol[i]=querry(a[i]-1);
  d[i]=d[sol[i]]+1;
  update(a[i],i);
 }
 
 int p=1;
  for(i=2;i<=n;++i)
    if(d[i]>d[p])
      p=i;
	fout<<d[p]<<'\n';
 afis(p);
 fout<<'\n';
 fin.close();
 fout.close();
 return 0;
}