Cod sursa(job #1561880)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 4 ianuarie 2016 17:23:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#define ValN 100005

using namespace std;

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

int N, i, cnt, c;
int sir[ValN], a;
int be, en, mid, x, mx;
int dp[ValN], inv[ValN];
int v[ValN];

int main()
{
    fin >> N;
    for (i=1; i<=N; i++)
    {
        fin >> v[i];
        inv[i]=2000000000;
    }
    for (i=1; i<=N; i++)
    {
        be=1;
        en=i-1;
        x=0;
        while (be<=en)
        {
            mid=(be+en) / 2;
            if (inv[mid]>=v[i])
              en=mid-1;
            else
            {
                be=mid+1;
                x=max(x, mid);
            }
            mid=(be+en) / 2;
        }
        dp[i]=x+1;
        if (dp[i]>mx)
        {
            mx=dp[i];
            cnt=i;
        }
        inv[dp[i]]=min(inv[dp[i]], v[i]);
    }
    fout << mx << '\n';
    c=cnt;
    sir[++a]=v[cnt];
    for (i=c-1; i>=1; i--)
    {
        if (dp[cnt]==dp[i]+1 && v[i]<v[cnt])
        {
            sir[++a]=v[i];
            cnt=i;
        }
    }
    for (i=mx; i>=1; i--)
      fout << sir[i] << " ";
    fin.close();
    fout.close();
    return 0;
}