Cod sursa(job #177122)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 12 aprilie 2008 12:50:45
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100010
int n,nr;
int v[N],pred[N];
int x[N];
void scan(){
     int i;
     freopen("scmax.in","r",stdin);
     freopen("scmax.out","w",stdout);
     scanf("%d",&n);
     for (i=1;i<=n;++i)
        scanf("%d",&v[i]);
}
int b_search(int p,int u,int key){
    int m;
    while (p<u){
          m=(p+u)/2;
          if (v[x[m]]==key)
             return m;
          if (v[x[m]]<key)
             p=m+1;
          else
              u=m;
    }
    if(v[x[p]]<key)
        ++p;
    return p;
}
void subsir(int y){
     if (pred[y]>0)
        subsir(pred[y]);
     printf("%d ",v[y]);
}
void printx(){
     int i;
     for (i=1;i<=nr;++i)
         printf("%d ",x[i]);
     printf("\n");
}
void solve(){
     int i,poz;
     pred[0]=-1;
     x[++nr]=1;pred[1]=-1;
     //printf("%d ",n);
     for (i=2;i<=n;++i){
         poz=b_search(1,nr,v[i]);
         if (poz==nr+1)
            ++nr;
         x[poz]=i;
         pred[i]=x[poz-1];
         //printx();
     }
}
void print(){
    printf("%d\n",nr);
    subsir(x[nr]);
    fclose(stdin);
    fclose(stdout);
    exit(0);
}
int main(void){
    scan();
    solve();
    print();
}