Cod sursa(job #177233)

Utilizator cretuMusina Rares cretu Data 12 aprilie 2008 14:49:43
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define bit(x) ((x&(x-1))^(x))
#define MAX 100005

using namespace std;

int n;
int val[MAX], a[MAX], aib[MAX], prim[MAX], v[MAX], t[MAX];

void Update(int x, int poz)
{
    for (; x <= n; x += bit(x))     
         if (a[poz] > a[aib[x]])
             aib[x] = poz;
}

int Query(int x)
{
    int max = 0;
    for (; x; x -= bit(x))
        if (a[aib[x]] > a[max])
            max = aib[x];
    return max;
}

int main()
{
    int i, h = 1, maxi = 0;
    
    ifstream fin("scmax.in");
    fin >> n;
    for (i = 1; i <= n; i++)    
    {
        fin >> val[i];
        prim[i] = val[i];    
    }
    fin.close();
    
    sort(prim+1, prim+n+1);
    for (i = 2; i <= n; i++)
        if (prim[i] != prim[h]) prim[++h] = prim[i];
    
    for (i = 1; i <= n; i++)
        v[i] = lower_bound(prim+1, prim+h+1, val[i]) - prim; 
    
    for (i = 1; i <= n; i++)
    {
        t[i] = Query(v[i]-1);
        a[i] = a[t[i]] + 1;
        Update(v[i], i);    
    }
    
    ofstream fout("scmax.out");
    for (i = 1; i <= n; i++)
        if (a[maxi] < a[i]) maxi = i;
        
    fout << a[maxi] << "\n";
    for (h = 0, i = maxi; i; i = t[i])
        prim[++h] = val[i];
    for (i = h; i; i--)
        fout << prim[i] << " ";
    fout.close();
    
    return 0;
}