Cod sursa(job #694978)

Utilizator giuliastefGiulia Stef giuliastef Data 28 februarie 2012 09:45:05
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
// Subsir crescator maximal cu cautare binara

#include <fstream>
#include <algorithm>
#define NMAX 100011
using namespace std;
int v[NMAX],a[NMAX],t[NMAX],pos[NMAX];
int main(){
    int N,i,m,k,st,dr,nr;
    ifstream in("scmax.in");
    ofstream out("scmax.out");
    in>>N;
    for(i=1;i<=N;i++)
     in>>v[i];
    for(i=1;i<=N;i++)
     if(v[i]>a[k]){
      a[++k]=v[i];
      pos[k]=i; t[i]=pos[k-1];
     }
     else{
      st=1; dr=k;
      while(st<=dr){
       m=(st+dr)/2;
       if(a[m-1]<v[i] && a[m]>v[i]){
        a[m]=v[i];
        pos[m]=i, t[i]=pos[m-1]; 
        break;
       }
       else if(a[m-1]<v[i] && a[m]<v[i])
        st=m+1;
       else if(a[m-1]>v[i] && a[m]>v[i])
        dr=m-1;
       else break;
      }
     }
    nr=1;
    a[nr]=v[pos[k]];
    k=t[pos[k]];
    while(k){
     a[++nr]=v[k]; k=t[k];        
    }
    reverse(a+1,a+nr+1);
    out<<nr<<"\n";
    for(i=1;i<=nr;i++) 
     out<<a[i]<<" ";
    out<<"\n";
    return 0;
    
}