Cod sursa(job #2539217)

Utilizator victorzarzuZarzu Victor victorzarzu Data 5 februarie 2020 19:05:34
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>
#define zeros(x) ((x ^ (x - 1)) & x)
#define NMax 100005
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,v[NMax],d[NMax],t[NMax];
int len;


void Read()
{
    f>>n;
    for(int i = 1;i <= n;++i)
        f>>v[i];
}

void reconstituie(int ind)
{
    if(t[ind])
        reconstituie(t[ind]);
    g<<v[ind]<<" ";
}

void Solve()
{
    len = d[1] = 1;
    for(int i = 2;i <= n;++i)
    {
        int left = 1;
        int right = len;

        while(left <= right)
        {
            int mid = (left + right) / 2;

            if(v[d[mid]] >= v[i])
                right = mid - 1;
            else
                left = mid + 1;
        }

        int pos = left;

        if(pos > len)
        {
            ++len;
            d[len] = i;
            t[d[len]] = d[pos - 1];
        }
        else
        {
            d[pos] = i;
            t[d[pos]] = d[pos - 1];
        }
    }
    g<<len<<'\n';
    reconstituie(d[len]);
    g.close();
    f.close();
}

int main()
{
    Read();
    Solve();
    return 0;
}