Cod sursa(job #2236080)

Utilizator armigheGheorghe Liviu Armand armighe Data 28 august 2018 07:45:14
Problema Subsir 2 Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<cstdio>
#include<fstream>
#include<algorithm>
using namespace std;
FILE *f=fopen("subsir2.in","r");
ofstream g("subsir2.out");
int v[5002],l[5002],ant[5002],r[5002];
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--]=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;
}