Cod sursa(job #642670)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 1 decembrie 2011 21:09:02
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#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;
}