Cod sursa(job #2305131)

Utilizator mihailrazMihail Turcan mihailraz Data 19 decembrie 2018 13:09:32
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <algorithm>
#define NMAX 100000
#define INF 2000000000
#define LSB(x) x^(x&(x-1))

using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");
int n;
int V[NMAX+5], Y[NMAX+5], DP[NMAX+5], PRE[NMAX+5], AIB[NMAX+5];

struct element
{
    int ind, val;
} X[NMAX+5];

int cmp(element a, element b)
{
    if(a.val==b.val)
        return a.ind>b.ind;
    return a.val<b.val;
}

int maxind(int pos)
{
    int maxi=0;
    while(pos)
    {
        if(DP[AIB[pos]]>DP[maxi])
            maxi=AIB[pos];
        pos^=LSB(pos);
    }
    return maxi;
}

void update(int pos, int ind)
{
    while(pos<=n)
    {
        if(DP[ind]>DP[AIB[pos]])
            AIB[pos]=ind;
        pos+=LSB(pos);
    }
}

void afisare(int pos)
{
    if(PRE[pos]!=0)
        afisare(PRE[pos]);
    fo<<V[pos]<<" ";
}

int main()
{
    fi>>n;
    for(int i=1; i<=n; i++)
    {
        fi>>X[i].val;
        V[i]=X[i].val;
        X[i].ind=i;
    }
    sort(X+1, X+n+1, cmp);

    for(int i=1; i<=n; i++)
    {
        int indice=maxind(X[i].ind-1);
        DP[X[i].ind]=DP[indice]+1;
        PRE[X[i].ind]=indice;
        update(X[i].ind, X[i].ind);
    }

    fo<<DP[maxind(n)]<<"\n";
    afisare(maxind(n));

    fi.close();
    fo.close();
    return 0;
}