Pagini recente » Cod sursa (job #2273158) | Cod sursa (job #307527) | Istoria paginii preoni-2008/runda-2 | Cod sursa (job #697788) | Cod sursa (job #1539313)
#include<fstream>
#include<stdlib.h>
#define nMax 100005
#define nrMax 2000000005
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,v[nMax],p[nMax],q[nMax],lungimeV,*S[nMax];
void citire(){
in>>n;
for(int i=0;i<n;++i){
in>>v[i];
}
}
int insrt(int k,int l, int h){
int m=(l+h)/2;
if(l==h){
if(h>lungimeV) q[++lungimeV+1]=nrMax;
q[l]=k;
}
else if(k<q[m]) return insrt(k,l,h);
else return insrt(k,m+1,h);
}
void biuldPQ(void){
lungimeV=0;q[1]=nrMax;
for(int i=1;i<n;++i){
p[i]=insrt(v[i],1,lungimeV+1);
}
}
void biuldS(void){
int k=n;
S=malloc(sizeof(*S));
for(int i=lungimeV;i;--i){
while(p[k]!=i)--k;
(*S)[i]=v[k];
}
}
void afisare(void){
out<<lungimeV<<endl;
for(int i=1;i<=lungimeV;++i)out<<(*S)[i]<<" ";
}
int main(){
citire();
biuldPQ();
biuldS();
afisare();
}