Pagini recente » Cod sursa (job #264934) | Cod sursa (job #2456276) | Cod sursa (job #3219768) | Cod sursa (job #2538869) | Cod sursa (job #642670)
Cod sursa(job #642670)
#include <stdio.h>
#include <vector>
#define nmax 100010
using namespace std;
int n;
struct nod{
int val, prev;
};
vector <nod> stiva[nmax];
FILE *fin,*fout;
void recovery(int st, int loc){
if(st>0){
recovery(st-1,(stiva[st].back()).prev);
}
fprintf(fout,"%d ",(stiva[st].back()).val);
}
int cauta_binar(int val,int li,int ls){
/* if(li==ls){
if((stiva[li].back()).val>=val)return li;
return -1;
}
if(li<ls){
int mij=li+(ls-li)/2;
if((stiva[mij].back()).val<val){
if((stiva[mij+1].back()).val>=val)return mij+1;
return cauta_binar(val,mij+1,ls);
}else{
if((stiva[mij].back()).val==val)return mij;
return cauta_binar(val,li,mij-1);
}
}*/
int i;
for(i=li;i<=ls;i++){
if(((stiva[i].back()).val>=val))return i;
}
return -1;
}
int main(){
fin=fopen("scmax.in","r");
fout=fopen("scmax.out","w");
int k=-1;//numarul de stive
int i;
int aux,ind;
fscanf(fin,"%d",&n);
nod nodulet;
for(i=0;i<n;i++){
fscanf(fin,"%d",&aux);
ind=cauta_binar(aux,0,k);
if(ind==-1)ind=++k;
nodulet.val=aux;
nodulet.prev=(ind==0?-1:stiva[ind-1].size());
stiva[ind].push_back(nodulet);
}
fprintf(fout,"%d\n",k+1);
recovery(k,(stiva[k].back()).prev);
fprintf(fout,"\n");
return 0;
}