Cod sursa(job #642723)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 1 decembrie 2011 23:17:53
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 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==-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((ls-li)==1){
      if((stiva[li].back()).val>=val)return li;
      if((stiva[ls].back()).val>=val)return ls;
      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;
         }else return cauta_binar(val,li,mij-1);
      }else{
          return cauta_binar(val,mij+1,ls);
      }
   }
  /*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;
}