Cod sursa(job #1606610)

Utilizator andreiudilaUdila Andrei andreiudila Data 20 februarie 2016 13:41:33
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
/*ifstream fin("scmax.in");
ofstream fout("scmax.out");
*/

int i,dp[100001],n,j,sol[100001],k,aib[100001];

struct sir{

int val, poz;

}a[100001];

void update(int poz, int val)
{
    while(poz<=n)
    {
        aib[poz]=max(val, aib[poz]);

        poz+=(poz&(-poz));
    }
}

int query(int poz)
{
    int rez=aib[poz];

    while(poz>0)
    {
        poz-=(poz&(-poz));

        rez=max(rez,aib[poz]);
    }

    return rez;
}

bool cmp(sir a, sir b)
{
    if(a.val != b.val) return a.val<b.val;
    else return a.poz>b.poz;
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    scanf("%d", &n);
    for(i=1;i<=n;i++)
       {
         scanf("%d", &a[i].val); a[i].poz=i;
       }


    sort(a+1,a+n+1,cmp);


        dp[1]=1;
        update(a[1].poz, dp[1]);


        for(i=2;i<=n;i++)
        {
        dp[i]=1+query(a[i].poz-1);
        update(a[i].poz,dp[i]);
        }


        int maxi=0,pmax=0;

        for(i=1;i<=n;i++)
            if(dp[i]>maxi) maxi=dp[i],pmax=i;

        //fout<<maxi<<'\n';
            printf("%d\n", maxi);
        sol[++k]=a[pmax].val;

        for(i=pmax-1;i>=1;--i)
        {
            if(dp[pmax]==dp[i]+1 && a[i].poz<a[pmax].poz) { sol[++k]=a[i].val; pmax=i;}
        }


        for(i=k;i>=1;--i)
            //fout<<sol[i]<<" ";
            printf("%d ", sol[i]);
    return 0;
}