Cod sursa(job #2485880)

Utilizator ianiIani Biro iani Data 2 noiembrie 2019 10:26:21
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

int ind[100005],a[100005];

/*void afisare(int i,int k)
{
    
    if (i<=0)
        return;
    while(ind[k]>=i)
    {
        k--;
    }
    afisare(i-1,k);
    fout<<a[k]<<' ';
}*/

void afisare(int i)
{
    int aux=i;
    int caut=ind[i]-1;
    if (caut==0)
    {
        fout<<a[i]<<' ';
        return;
    }
    while(ind[i]!=caut)
        i--;
    afisare(i);
    fout<<a[aux]<<' ';
}

int main()
{
    int n,v[100005],k=1,l=1,maxi=-1,imax=1;
    fin>>n;
    for (int i=1;i<=n;i++)
        fin>>a[i];
    v[1]=a[1];
    ind[1]=1;
    for (int i=2;i<=n;i++)
    {
        if (a[i]>v[k])
        {
            k++;
            v[k]=a[i];
            l++;
            ind[l]=ind[l-1]+1;
            if (ind[l]>maxi)
            {
                maxi=ind[l];
                imax=l;
            }
        }
        else
        {
            int st=1,dr=i,mij;
            while (st<=dr)
            {
                mij=(st+dr)/2;
                if (a[i]<=v[mij])
                    dr=mij-1;
                else
                    st=mij+1;
            }
            //cout<<a[i]<<' '<<st<<endl;
            v[st]=a[i];
            ind[++l]=st;
            if (st>maxi)
            {
                maxi=st;
                imax=l;
            }
        }
    }
    /*cout<<endl;
    for (int i=1;i<=k;i++)
        cout<<v[i]<<' ';
    cout<<endl;
    for (int i=1;i<=n;i++)
        cout<<ind[i]<<' ';
    cout<<endl;
    //afisare(maxi,imax);
    cout<<imax<<' '<<maxi<<endl;*/
    afisare(imax);
    return 0;
}