Cod sursa(job #1787083)

Utilizator ade_tomiEnache Adelina ade_tomi Data 24 octombrie 2016 09:14:59
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100003
using namespace std;

struct str 
{
    int x, y;

};
int aib[NMAX],s[NMAX], d[NMAX], v[NMAX];
bool  cmp (int a, int b)
{
    if (v[a] == v[b])
        return a > b;
     return v[a] < v[b];
}
int lsb(int x)
{
    return x & (-x);
}
void update (int poz, int val)
{
    while (poz <= NMAX)
    {
       
        if (d[val]> d[aib[poz]])
            aib[poz] = val;
        poz += lsb(poz);
    }
}
int query(int poz)
{
    int sol = 0;
    while (poz > 0)
    {
        if (d[aib[poz]] > d[sol])
            sol = aib[poz];
        poz -= lsb(poz);
    }
    return sol;
}
int a[NMAX];
int p[NMAX], p_start, n;
int main ()
{
    ifstream cin ("scmax.in");
    ofstream cout ("scmax.out");
    cin >> n;
    int sol = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i];
        a[i] = i;
    }
    sort (a + 1, a + 1 + n, cmp);
    for (int i = 1; i <= n; i++)
    {
        p[i] = query (a[i] - 1);
        d[i] = d[p[i]] + 1;
        if (d[i] > sol)
        {
            sol = d[i];
            p_start = i;
        }
        update (a[i], i);
    }
    int m = 0;
    cout << sol << "\n";
    while (p_start != 0)
    {
        m ++;
        s[m] = v[a[p_start]] ;
        p_start = p[p_start];
    }
    for (int i = m; i >= 1; i--)
        cout << s[i] << " ";
    return 0;

}