Cod sursa(job #1570550)

Utilizator andreiudilaUdila Andrei andreiudila Data 16 ianuarie 2016 17:08:49
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <unordered_map>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int a[100001],i,dp[100001],n,j,sol[100001],k,aib[100001],aux[100001];

unordered_map <int,int> mymap;

void update(int poz, int val)
{
    while(poz<=n)
    {
        aib[poz]=max(val, aib[poz]);

        poz+=(poz&(-poz));
    }
}

int query(int poz)
{
    int rez=aib[poz];

    while(poz>0)
    {
        poz-=(poz&(-poz));

        rez=max(rez,aib[poz]);
    }

    return rez;
}
int main()
{
    fin>>n;
    for(i=1;i<=n;i++)
       {
         fin>>a[i]; aux[i]=a[i];
       }


    sort(aux+1,aux+n+1);

    for(i=1;i<=n;i++)
        {
        mymap[aux[i]]=i;

        }

    for(i=1;i<=n;i++) aux[i]=a[i];

    for(i=1;i<=n;i++)
        a[i]=mymap[a[i]];


        dp[1]=1;
        update(a[1], dp[1]);


        for(i=2;i<=n;i++)
        {
        dp[i]=1+query(a[i]-1);
        update(a[i],dp[i]);
        }


        int maxi=0,pmax=0;

        for(i=1;i<=n;i++)
            if(dp[i]>maxi) maxi=dp[i],pmax=i;

        fout<<maxi<<'\n';

        sol[++k]=aux[pmax];

        for(i=pmax-1;i>=1;--i)
        {
            if(dp[pmax]==dp[i]+1 && a[i]<a[pmax]) { sol[++k]=aux[i]; pmax=i;}
        }


        for(i=k;i>=1;--i)
            fout<<sol[i]<<" ";

    return 0;
}