Cod sursa(job #1244397)

Utilizator RaileanuCristian Raileanu Raileanu Data 17 octombrie 2014 11:48:20
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include<algorithm>
#include<iostream>
using namespace std;
#define MX 100010
int v[MX],res[MX] , lst[MX],aib[MX],d[MX],up[MX],n,i, k ;

ifstream f1("scmax.in");
ofstream f2("scmax.out");

void update(int x,int ind)
{
    for (;x<=n;x+=x^((x-1)&x) )
        if (d[ind]>d[aib[x] ] )
            aib[x]=ind;
}

int query(int x)
{
    int mx=0;
    for ( ;x; x-=x^((x-1)&x ) )
        if (d[aib[x] ]>d[mx] ) mx=aib[x];

    return mx;
}

int low_b(int a, int b,int v)
{
    int m=(a+b)/2;
    if (lst[m]==v) return m;
    if (v<lst[m] ) return low_b(a,m,v);
        else return low_b(m+1,b,v);
}

int main()
{
    f1>>n;
    for (i=1;i<=n;i++)
       {f1>>v[i]; lst[i]=res[i]=v[i]; }

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

    for (i=2,k=1 ; i<=n; i++)
        if (lst[k]!=lst[i] )
          lst[++k]=lst[i];

    for (i=1; i<=n;i++)
        v[i]=low_b(1,k,v[i]);

    for (i=1; i<=n;i++)
    {   up[i]= query(v[i]-1);
        d[i]=d[up[i] ]+1;
        update(v[i],i);
    }

    int pm=1;
    for (i=2;i<=n;i++)
        if (d[i]>d[pm]) pm=i;

    for (i=pm; i>0; i=up[i] )
        lst[d[i]]=i;

    f2<<d[pm]<<"\n";
    for (i=1;i<=d[pm];i++ )
        f2<<res[lst[i] ]<<" ";

    f2.close();
    return 0;
}