Cod sursa(job #1073230)

Utilizator sebinechitasebi nechita sebinechita Data 5 ianuarie 2014 20:12:11
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define MAX 101000

int AIB[MAX], cpy[MAX], a[MAX], v[MAX], n, rez[MAX], dad[MAX];

int cauta(int p)
{
    int s=0;
    while(p)
    {
        if(rez[AIB[p]]>rez[s])
        {
            s=AIB[p];
        }
        p-=(p^(p&(p-1)));
    }
    return s;
}

int introdu(int nr, int p)
{
    while(p<=n)
    {
        if(rez[AIB[p]]<rez[nr])
        {
            AIB[p]=nr;
        }
        p+=(p^(p&(p-1)));
    }
}

void af(int nod)
{
    if(!nod)
        return;
    af(dad[nod]);
    fout<<cpy[nod]<<" ";
}

int main()
{
    fin>>n;
    int i;
    for(i=1;i<=n;i++)
    {
        fin>>cpy[i];
        a[i]=cpy[i];
    }
    sort(a+1, a+n+1);
    for(i=1;i<=n;i++)
    {
        v[i]=lower_bound(a+1, a+n+1,cpy[i])-a;
    }
    for(i=1;i<=n;i++)
    {
        dad[i]=cauta(v[i]-1);
        rez[i]=rez[dad[i]]+1;
        introdu(i, v[i]);
    }
    int s=1;
    for(i=1;i<=n;i++)
    {
        if(rez[s]<rez[i])
            s=i;
    }
    fout<<rez[s]<<"\n";
    af(s);


}