Cod sursa(job #2158182)

Utilizator ioanavasilescuIoana Vasilescu ioanavasilescu Data 10 martie 2018 11:10:13
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <cstdio>

using namespace std;

FILE *fin=fopen("scmax.in","r");
FILE *fout=fopen("scmax.out","w");

int a[100000], t[100000], ind[100000], last[100000];

int cauta(int x,int k)
{
    int st=0,dr=k,mij;
    while(st<=dr)
    {
        mij=st+(dr-st)/2;
        if(last[mij]==x)return mij;
        if(last[mij]<x)st=mij+1;
        else dr=mij-1;
    }
    return dr+1;
}

void afish(int i)
{
    if(t[i]==-1)
    {
        fprintf(fout,"%d ",a[i]);
        return;
    }
    afish(t[i]);
    fprintf(fout,"%d ",a[i]);
}

int main()
{
    int n,k=0;
    fscanf(fin,"%d",&n);
    for(int i=0;i<n;i++)
        fscanf(fin,"%d",&a[i]);
    last[0]=a[0];
    ind[0]=0;
    t[0]=-1;
    for(int i=1;i<n;i++)
    {
        if(a[i]>last[k])
        {
            k++;
            last[k]=a[i];
            ind[k]=i;
            t[i]=ind[k-1];
        }
        else
        {
            int dr=cauta(a[i],k);
            if(last[dr]<a[i])
                dr++;
            last[dr]=a[i];
            t[i]=t[ind[dr]];
            ind[dr]=i;
        }
    }
    fprintf(fout,"%d\n",k+1);
    afish(ind[k]);
    for(int i=0;i<n;i++)
        cout<<t[i]<<" ";
    return 0;
}