Cod sursa(job #2097822)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 1 ianuarie 2018 18:10:56
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define VAL 100005
#define F first
#define S second

using namespace std;

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

int N, M, i, j, v[VAL], poz, aib[VAL];
int fat[VAL], dp[VAL], cop[VAL];
pair <int, int> nr[VAL];
vector <int> SOL;

int zero(int X)
{
    return X & (-X);
}

void Update(int X, int poz)
{
    while (X<=N)
    {
        if (dp[aib[X]]<dp[poz])
          aib[X]=poz;
        X+=zero(X);
    }
}

int Query(int X)
{
    int mx=0;
    while (X>0)
    {
        if (dp[aib[X]]>dp[mx])
          mx=aib[X];
        X-=zero(X);
    }
    return mx;
}

int main()
{
    fin >> N;
    for (i=1; i<=N; i++)
    {
        fin >> v[i];
        nr[i].F=cop[i]=v[i];
        nr[i].S=i;
    }
    sort(nr+1, nr+N+1);
    for (i=1; i<=N; i++)
    {
        if (nr[i].F!=nr[i-1].F)
          M++;
        v[nr[i].S]=M;
    }
    M=0;
    for (i=1; i<=N; i++)
    {
        fat[i]=Query(v[i]-1);
        dp[i]=dp[fat[i]]+1;
        if (M<dp[i])
        {
            M=dp[i];
            poz=i;
        }
        Update(v[i], i);
    }
    fout << M << '\n';
    while (poz!=0)
    {
        SOL.push_back(cop[poz]);
        poz=fat[poz];
    }
    for (i=M-1; i>=0; i--)
      fout << SOL[i] << " ";
    fin.close();
    fout.close();
    return 0;
}