Cod sursa(job #217503)

Utilizator raduzerRadu Zernoveanu raduzer Data 28 octombrie 2008 20:12:15
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>

const int MAX_N = 100010;

int n, z;
int a[MAX_N], prec[MAX_N], d[MAX_N], poz[MAX_N];

int bin(int val)  
{  
    int l = 1, r = z, mij;
    
    while (l <= r)
    {
          mij = l + (r - l) / 2;
          if (mij == 0) mij = 1;
          
          if (d[mij - 1] < val && val <= d[mij]) return mij;
          if (d[mij] < val) l = mij + 1;
          else if (val <= d[mij - 1]) r = mij - 1;
    }  
    return z + 1;
}  

int main()
{
    int i;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    
    scanf("%d", &n);
    for (i = 1; i <= n; ++i)
    {
        scanf("%d", a + i);
        
        int q = bin(a[i]);
        
        if (q > z) ++z;
        
        d[q] = a[i];
        poz[q] = i;  
        prec[i] = poz[q - 1];
    }
    printf("%d\n", z);
    
    int x = poz[z];
    for (i = z; i > 0; --i)
    {
        d[i] = a[x];
        x = prec[x];
    }
    
    for (i = 1; i <= z; ++i) printf("%d ", d[i]);
}