Cod sursa(job #1736174)

Utilizator Lungu007Lungu Ionut Lungu007 Data 1 august 2016 12:57:34
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100001
using namespace std;

int n,a[NMAX],aib[NMAX],pre[NMAX],nr[NMAX],v[NMAX],d[NMAX],normalized[NMAX],Max,val,y;

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

int lsb(int x)
{
    return (x&(-x));
}
void af(int i);
void update(int idx,int val)
{
    for(int i=idx;i<=n;i+=lsb(i))
    {
        if(val>aib[i])
        {
            nr[i] = y;
            aib[i] = val;
        }
    }
}
int read(int idx)
{
    int sol = 0;
    for(int i=idx;i>0;i-=lsb(i))
    {
        if(sol<aib[i])
        {
            sol = aib[i];
            y = nr[i];
        }
    }
    return sol;
}
int main()
{
    in >> n;
    for(int i=1;i<=n;i++)
    {
        in >> a[i];
        normalized[i] = v[i] = a[i];
    }
    sort(normalized+1,normalized+n+1);

    for(int i=1;i<=n;i++)
    {
        v[i] = lower_bound(normalized,normalized+n+1,v[i]) - normalized;
    }

    for(int i=1;i<=n;i++)
    {
        Max = read(v[i]-1);
        if(Max!=0)
            pre[i] = y;
        else
            pre[i]=0;
        y = i;
        update(v[i],Max+1);
        d[i]= Max+1;

    }

    Max = 0;
    int pos = 0;
    for(int i=1;i<=n;i++)
    {
        if(d[i]>Max)
        {
            pos = i;
            Max = d[i];
        }
    }


    out << Max << "\n";

   // af(pos);
    return 0;
}

void af(int i)
{
    if(i==0) return;

    af(pre[i]);
    out << a[i] << " ";
}