Cod sursa(job #2236107)

Utilizator mihailescu_eduardMihailescu Eduard-Florin mihailescu_eduard Data 28 august 2018 09:46:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <vector>
FILE *fin = freopen("scmax.in","r",stdin); FILE *fout = freopen("scmax.out","w",stdout);


static const int MAX_N = 100000 + 5;

/* =------------- Data ------------*/
int n, size;
int a[MAX_N], prev[MAX_N], index[MAX_N];

/* =------------- Data ------------*/

void Read()
{
    scanf("%d",&n);
    for(int i = 1; i<= n; ++i)
        scanf("%d",&a[i]);
}
void Construct()
{
    int pos;
    size = 0;

    for(int i = 1; i<= n; ++i)
    {
        if(a[i] > a[index[size]]){
            index[++size] = i;
            prev[i] = index[size - 1];
        }
        else
        {
            int left = 1, right = size, mid;
            while(left <= right)
            {
                mid = (left+right) >>1;
                if(a[i] <= a[index[mid]])
                    pos = mid, right = mid -1;
                else
                    left = mid + 1;
            }
            index[pos] = i;
            prev[i] = index[pos - 1];
        }
    }

}
void Reconstruct()
{
    printf("%d\n",size);

    std::vector<int> v;
    int x = index[size];

    while(x!=0)
    {
        v.push_back(a[x]);
        x = prev[x];
    }
    for(auto it = v.end() - 1; it != v.begin(); it--)
    {
        printf("%d ", *it);
    }
    printf("%d",v[0]);
}

int main()
{
    Read();
    Construct();
    Reconstruct();
    return 0;
}