Cod sursa(job #949151)

Utilizator selea_teodoraSelea Teodora selea_teodora Data 12 mai 2013 17:14:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include<stdio.h>

using namespace std;

int a[100005],v[100005],p[100005],n,maxim,pozmax,sol[100005];
int cautbin(int val, int vct[])
{
    int mij,st,dr,pos=0;
    st=1;
    dr=vct[0];
    while(st<=dr&&pos==0)
    {
        mij=(st+dr)/2;
        if(vct[mij]==val)
            pos=mij;
        else
        if(vct[mij]>val)
            dr=mij-1;
            else st=mij+1;

    }
    if(pos==0)
        return st;
    return pos;
}
void sir()
{

    v[0]=p[1]=1;
    v[1]=a[1];
    int i;
    for(i=2;i<=n;i++)
    {
        if(a[i]>v[v[0]])
        {
            v[0]++;
            v[v[0]]=a[i];
            p[i]=v[0];
        }
        else
        {
            p[i]=cautbin(a[i],v);
            v[p[i]]=a[i];
        }
        if(p[i]>maxim)
            {
                maxim=p[i];
                pozmax=i;
            }
    }
}
void solutie()
{
    int i;
    sol[maxim]=a[pozmax];
    for(i=pozmax-1;i>=1;i--)
    {
        if(p[i]==(maxim-1)&&a[i]<a[pozmax])
        {
            maxim--;
            pozmax=i;
            sol[maxim]=a[i];

        }
    }
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    sir();
    printf("%d\n",v[0]);
    solutie();
    for(int i=1;i<=v[0];i++)
        printf("%d ",sol[i]);
    printf("\n");
    return 0;
}