Cod sursa(job #1150789)

Utilizator cat_red20Vasile Ioana cat_red20 Data 23 martie 2014 15:37:18
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<fstream>
#include<algorithm>
using namespace std;
int n,v[200001],dp[200001],poz,aib[200001],sol,psol,tata[200001],s[200001];
struct norm
{
    int val,poz;
}a[200001];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void citire()
{
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>a[i].val;
        a[i].poz=i;
    }
}

int cmp(norm a,norm b)
{
    return a.val<b.val;
}

void normalizare()
{
    int nr=0;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        if(a[i].val!=a[i-1].val)
        {
            nr++;
        }
        v[a[i].poz]=nr;
        s[nr]=a[i].val;
    }
}

int query(int val)
{
    int sol=0,ind=0;
    for(int i=val-1;i>=1;i-=(i&(-i)))
    {
        if(dp[aib[i]]>dp[ind])
        {
            ind=aib[i];
        }
    }
    return ind;
}

void update(int val,int p)
{
    for(int i=val;i<=n;i+=(i&(-i)))
    {
        if(dp[aib[i]]<dp[p])
        {
            aib[i]=p;
        }
    }
}

void afisare(int poz)
{
    if(poz!=0)
    {
        afisare(tata[poz]);
        fout<<s[v[poz]]<<" ";
    }
}

int main()
{
    citire();
    normalizare();
    for(int i=1;i<=n;i++)
    {
        poz=query(v[i]);
        tata[i]=poz;
        dp[i]=dp[poz]+1;
        update(v[i],i);
        if(dp[i]>sol)
        {
            sol=dp[i];
            psol=i;
        }
    }
    fout<<sol<<"\n";
    afisare(psol);
    return 0;
}