Cod sursa(job #2232102)

Utilizator armigheGheorghe Liviu Armand armighe Data 17 august 2018 12:33:46
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<cstdio>
#include<fstream>
#include<algorithm>
using namespace std;
FILE *f=fopen("scmax.in","r");
ofstream g("scmax.out");
int v[100002],l[100002],ant[100002],r[100002];
int n,len;

void scmax(int id)
{
    int st,dr,mij,ans=0;
    st=0;
    dr=len;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(v[l[mij]]<v[id])
        {
            st=mij+1;
            ans=mij;
        }
        else
            dr=mij-1;
    }
    if(v[l[ans+1]]>v[id]||ans==len)
        l[ans+1]=id;
    len=max(len,ans+1);
    ant[id]=l[ans];
}

void reconstituire()
{
    int i=l[len],ll=len;
    while(i!=0)
    {
        r[len--]=v[i];
        i=ant[i];
    }
    for(i=1;i<=ll;i++)
        g<<r[i]<<" ";
}

int main()
{
    int i;
    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);
    for(i=1;i<=n;i++)
        scmax(i);
    g<<len<<'\n';
    reconstituire();
    return 0;
}