Cod sursa(job #1246269)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 20 octombrie 2014 21:01:20
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
//#include <iostream>
#include <stdio.h>
#define nmax 100001
using namespace std;
FILE *f=fopen("scmax.in","r"),*g=fopen("scmax.out","w");
long v[nmax],p[nmax],q[nmax],s[nmax],len,n;
void consts()
{
    long k=n,i;
    for(i=len;i;i--)
    {
        while(p[k]!=i)
            k--;
        s[i]=v[k];
    }
}
long ins(long lo, long hi, long k)
{
    long m=(lo+hi)/2;
    if(hi==lo)
    {
        if(hi>len&&q[hi-1]!=k)
            q[++len+1]=2000000001;
        if(q[hi-1]!=k)
        q[lo]=k;
        return lo;
    }
    else if(k<q[m])
        return ins(lo,m,k);
    else if(k>q[m])return ins(m+1,hi,k);
    else return m;
}
void constpq()
{
    long i;
    q[1]=2000000001;
    for(i=1;i<=n;i++)
        p[i]=ins(1,len+1,v[i]);
}
int main()
{
    fscanf(f,"%d",&n);
    long i;
    for(i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);
    constpq();
    consts();
    fprintf(g,"%ld\n",len);
    for(i=1;i<=len;i++)
        fprintf(g,"%ld ",s[i]);
    return 0;
}