Cod sursa(job #1150791)

Utilizator cat_red20Vasile Ioana cat_red20 Data 23 martie 2014 15:41:08
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<fstream>
#include<algorithm>
#include<cstdio>
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;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].val);
        //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]]<<" ";
        printf("%d ",s[v[poz]]);
    }
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    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";
    printf("%d\n",sol);
    afisare(psol);
    return 0;
}