Cod sursa(job #1203917)

Utilizator pavlov.ionPavlov Ion pavlov.ion Data 1 iulie 2014 15:47:07
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<fstream>
using namespace std;
 #define INF 30000
 typedef long long Vector[100000];
ifstream cin("scmax.in");
ofstream cout("scmax.out");
 Vector v,p,q,s;
 long long N,Len; /*Len-lungimea vectorului Q*/
 void ReadData() {
 	  int i;
 	  cin>>N;
 	  for(i=1;i<=N;i++)
 	  		cin>>v[i];
}
int Insert(int K,int Lo,int Hi)
{ int Mid=(Lo+Hi)/2;
  if(Lo==Hi)
		{ if (Hi>Len) q[++Len+1]=INF;
		  q[Lo]=K;
		  return Lo;
		  }
	else if(K<q[Mid])  return Insert(K,Lo,Mid);
		 			   else return Insert(K,Mid+1,Hi);
}
void BuildPQ()
{ int i;
  Len=0;q[1]=INF;
  for(i=1;i<=N;i++)
        p[i]=Insert(v[i],1,Len+1);
}
 void BuildS()
 {  int i,k=N;
 	for(i=Len;i;i--)
 	{ while(p[k]!=i) k--;
 	  s[i]=v[k];
	  }
}
void WriteSolution()
{ int i;
cout<<Len<<"\n";
for(i=1;i<=Len;i++)
            cout<<s[i]<<" ";
}
int main() {
      ReadData();
	  BuildPQ();
	  BuildS();
	  WriteSolution();
return 0;
}