Cod sursa(job #2158198)

Utilizator RaresV227Virjoghe Rares Constantin RaresV227 Data 10 martie 2018 11:15:15
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int a[100005], t[100005], last[100005], ind[100005], sol[100005];

int main()
{
    int n, k=1, s, d, mij, poz;
    f>>n;
    for(int i=1; i<=n; i++)
        f>>a[i];
    last[1]=a[1];
    ind[1]=1;
    t[1]=0;
    for(int i=2; i<=n; i++)
    {
        if(a[i]>last[k])
        {
            k++;
            last[k]=a[i];
            ind[k]=i;
            t[i]=ind[k-1];
        }
        else
        {
            poz=0;
            s=1;
            d=k;
            mij=(s+d)/2;
            do
            {
                if(last[mij]==a[i])
                    break;
                else if(last[mij]>a[i])
                {
                    poz=k;
                    s=mij+1;
                }
                else d=mij-1;
                mij=(s+d)/2;
            }
            while(s<=d);
            if(poz)
            {
                last[poz]=a[i];
                t[i]=ind[poz-1];
                ind[poz]=i;
            }
            else t[i]=0;
        }
    }
    poz=1;
    int i=ind[k];
    while(i)
    {
        sol[poz++]=a[i];
        i=t[i];
    }
    g<<poz-1<<'\n';
    for(i=poz-1; i>=1; i--)
        g<<sol[i]<<' ';

    return 0;
}