Cod sursa(job #870939)

Utilizator enedumitruene dumitru enedumitru Data 4 februarie 2013 09:24:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>    
using namespace std;
int n, nr, poz, v[100003], b[100003], p[100003], k, L[100003],s[100003]; 
int caut(int x) 
{ 
   int p, u, m; 
   p = 0; u = nr; m = (p+u)/2; 
   while (p <= u) 
   { 
      if (v[L[m]] < x &&  v[L[m+1]] >= x) return m; 
      else if (v[L[m+1]] < x) {p = m + 1; m = (p + u)/2;} 
      else {u = m - 1; m = (p + u)/2;} 
   } 
   return nr; 
}
int main() 
{  freopen("scmax.in","r",stdin); 
   freopen("scmax.out","w",stdout); 
   scanf("%d",&n); 
   for (int i = 1; i <= n; i++) scanf("%d", v + i); 
   b[1] = L[1] = nr = 1; L[0] =  0; 
   for (int i = 2; i <= n; i++) 
   { 
      poz = caut(v[i]); 
      p[i] = L[poz]; 
      b[i] = poz + 1; 
      L[poz + 1] = i; 
      if (nr < poz + 1)   nr = poz + 1; 
   } 
   poz = 1; 
   for (int i = 2; i <= n; i++) 
       if (b[poz] < b[i]) poz = i; 
   printf("%d\n",b[poz]); 
   nr=0;
   while (poz)  {s[++nr]=v[poz]; poz=p[poz];}
   for(int i=nr; i; --i) printf("%d ",s[i]);
   printf("\n");
   return 0;    
}