Cod sursa(job #1118540)

Utilizator lucianRRuscanu Lucian lucianR Data 24 februarie 2014 11:50:22
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<fstream> 
#include<iostream> 

using namespace std; 

#define MAX 100001 

 ifstream fin("scmax.in"); 
 ofstream fout("scmax.out"); 
 int a[MAX],b[MAX],poz[MAX]; 
 int n,m; 
 
 void citire() 
 { 
 int i; 
 fin>>n; 
 for(i=1;i<=n;i++) 
 fin>>a[i]; 
 } 
 
 int caut(int p, int u, int x) 
 { 
 int m; 
 while(p<=u) 
 { 
 m=p+(u-p)/2; 
 if(x<a[b[m]]) 
 p=m+1; 
 else 
 u=m-1; 
 } 
 return p; 
 } 

 
 void subsir() 
 { 
 int i,j,k; 
 a[0]=1234567890; 
 for(i=n;i>=1;i--) 
 { 
 poz[i]=0; 
 k=caut(1,m,a[i]); 
 if(k>m) 
 { 
 poz[i]=b[k-1]; 
 m=k; 
 b[k]=i; 
 } 
 else 
 { 
 poz[i]=b[k-1]; 
 if(a[b[k]]<a[i]) 
 b[k]=i; 
 } 
 } 
 } 
 
 void tipar() 
 { 
 int i; 
 fout<<m<<'\n'; 
 for(i=b[m];i>0;i=poz[i]) 
 { 
 fout<<a[i]<<' '; 
 } 
 } 
 int main() 
 { 
 citire(); 
 subsir(); 
 tipar(); 
 fin.close(); 
 return 0; 
 }