Pagini recente » Cod sursa (job #1019985) | Cod sursa (job #2193642) | Cod sursa (job #2960091) | Cod sursa (job #1241839) | Cod sursa (job #642691)
Cod sursa(job #642691)
#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){k++;ind=k;}
nodulet.val=aux;
if(ind>0)nodulet.prev=stiva[ind-1].size()-1;
stiva[ind].push_back(nodulet);
}
fprintf(fout,"%d\n",k+1);
recovery(k,stiva[k].size()-1);
fprintf(fout,"\n");
return 0;
}