Cod sursa(job #1157628)

Utilizator span7aRazvan span7a Data 28 martie 2014 17:50:12
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<fstream>
#include<algorithm>
#include<inttypes.h>
#define M 2000000000
using namespace std;
FILE *f=fopen("scm.in","r");
FILE *g=fopen("scm.out","w");
int n,q[100010],poz[100010],lung;
int sol[100010],v[100010];
int cauta(int x)
{
    int inc=1,sf=lung,m;
    while(inc<=sf)
    {
        m=(inc+sf)/2;
        if(q[m]<x)
            inc=m+1;
        else sf=m-1;
    }

    if(inc==lung+1){lung++;return lung;}
    return inc;
}
void afis()
{
    int i=lung,j=n,k=0;

    while(j>=1&&i)
    {
       if(poz[j]==i){sol[++k]=v[j];i--;}
       j--;
    }
    j=lung;
    while(j>=1){fprintf(g,"%d ",sol[j]);j--;}
}
int main()
{
    int i,p;
    fscanf(f,"%d",&n);
    q[1]=M;
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&v[i]);
        p=cauta(v[i]);
        if(p==lung+1){lung++;q[lung+1]=M;}
        q[p]=v[i];
        poz[i]=p;
    }
    fprintf(g,"%d\n",lung);
    afis();
    return 0;
}