Cod sursa(job #1372234)

Utilizator andi12Draghici Andrei andi12 Data 4 martie 2015 12:22:29
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>

using namespace std;
const int N=100005;
int v[N],pred[N],l[N],best=0,sol[N];
void caut(int i)
{
    int pas=1<<18,p=0;;
    while(pas>N)
        pas=pas/2;
    while(pas>=1)
    {
        if(p+pas<N-2 && l[p+pas]!=0 && v[l[p+pas]]<=v[i])
        {
            p=p+pas;
        }
        pas=pas/2;
    }
    if(v[i]<=v[l[p]])
    {
        l[p]=i;
        pred[i]=l[p-1];
    }
    else
    {
        p++;
        l[p]=i;
        pred[i]=l[p-1];
    }
    if(best<p)
        best=p;
}
int main()
{
    FILE *in,*out;
    in=fopen("scmax.in","r");
    out=fopen("scmax.out","w");
    int n,i,p;
    fscanf(in,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(in,"%d",&v[i]);
    for(i=1;i<=n;i++)
        caut(i);
    fprintf(out,"%d\n",best);
    p=l[best];
    for(i=1;p!=0;i++)
    {
        sol[i]=v[p];
        p=pred[p];
    }
    for(i=best;i>=1;i--)
        fprintf(out,"%d ",sol[i]);
    return 0;
}