Pagini recente » Cod sursa (job #1720232) | Cod sursa (job #241936) | Cod sursa (job #638331) | Cod sursa (job #1502046) | Cod sursa (job #2203944)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#define mx 100050
#define nrmx 2000000050
long A[mx], Q[mx];
int P[mx], N, len;
int InsertVal(long k, int st, int dr){
int md=(st+dr)/2;
if(st==dr){
if(dr>len) Q[++len+1]=nrmx;
Q[st]=k;
return st;
}
else if(k<=Q[md]) InsertVal(k,st,md);//else if(k<Q[md]) pentru a nu fi strict crescator
else InsertVal(k,md+1,dr);
}
void crearePQ(){
len =0; Q[1]=nrmx;
for(int i=1;i<=N;i++){
P[i]=InsertVal(A[i],1,len+1);
}
}
void afis(int xd, int i){ //xd e len; i=N
//Da... clar, tot timpul le afisam in ordine inversa... fml xD
/* cout<<len<<endl;
int i=N;
while(len){
if(P[i]==len){
cout<<A[i]<<" ";
--len;
}
--i;
}*/
if(xd){
if(P[i]==xd){
afis(xd-1,i-1);
cout<<A[i]<<" ";
}else
afis(xd,i-1);
}else
cout<<len<<endl;//Ok, am facut ceva interesant aici :))
}
int main(){
cin>>N;
for(int i=1;i<=N;i++)
cin>>A[i];
crearePQ();
afis(len,N);
}