Cod sursa(job #464829)

Utilizator nickyyLal Daniel Emanuel nickyy Data 21 iunie 2010 22:07:41
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <stdio.h>
#define nmax 100003
#define inf 2000000001
using namespace std;
int v[nmax],q[nmax],p[nmax],lg=0,n;
	
	void citire(void)
	{FILE *fin=fopen("scmax.in","r");
	 int i;
	 fscanf(fin,"%d",&n);
	 for(i=1;i<=n;i++) fscanf(fin,"%d",&v[i]);
	 fclose(fin);
	}
	
	int ins(int x,int st, int dr)
	{int m=(st+dr)/2;
	 if(st==dr)
		 {if(dr>lg) ++lg;
		  q[st]=x; return st;
		 }
	 else if(x<=q[m]) return ins(x,st,m);
		 else return ins(x,m+1,dr);
	}
	
	void solve(void)
	{int i,k=n;
	 for(i=1;i<=n;i++)
		 p[i]=ins(v[i],1,lg+1);
	 for(i=lg;i;i--)
		 {while(p[k]!=i) k--;
		  q[i]=v[k];
		 }
	}
	
	void scrie(void)
	{FILE *fout=fopen("scmax.out","w");
	 int i;
	 fprintf(fout,"%d\n",lg);
	 for(i=1;i<=lg;i++) fprintf(fout,"%d ",q[i]);
	 fclose(fout);
	}
	
int main(void)
{citire();
solve();
scrie();
return 0;
}