Cod sursa(job #1203924)

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