Pagini recente » Cod sursa (job #2797785) | Cod sursa (job #403553) | Cod sursa (job #1453387) | Cod sursa (job #1357531) | Cod sursa (job #642713)
Cod sursa(job #642713)
#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==-1)return;
recovery(st-1,stiva[st][loc].prev);
fprintf(fout,"%d ",stiva[st][loc].val);
}
int cauta_binar(int val,int li,int ls){
if(li==ls)
if((stiva[li].back()).val>=val)return li;
else return -1;
if(li<ls){
int mij=(li+ls)/2;
if((stiva[mij].back()).val<val){
if((stiva[mij+1].back()).val>=val)return mij+1;
else return cauta_binar(val,mij+2,ls);
}else{
if((stiva[mij].back()).val==val)return mij;
else 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;
}