Cod sursa(job #901715)

Utilizator costyv87Vlad Costin costyv87 Data 1 martie 2013 11:24:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
//HighFlow
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <fstream>
#include <string.h>
#include <cmath>
#include <algorithm>
#define fcat(c) while (c!='\n') fscanf(f,"%c",&c)
#define cat(c) while (c!='\n') scanf("%c",&c)
#define For(i,st,dr,k) for (int i=st;i<=dr;i+=k)
#define ll (long long)
using namespace std;
FILE *f,*g;
int v[100100],q[100100],p[100100];
int mx,n,i,cn,sol;

void rec(int ind,int x)
{
    if (x==0) return;
    while (p[ind]!=x) ind--;
    rec(ind,x-1);
    fprintf(g,"%d ",v[ind]);
}

void caut(int st,int dr,int x)
{
    if(st<=dr)
    {
        int m=(st+dr)/2;
        if (q[m]<x)
        {
            mx=max(m,mx);
            caut(m+1,dr,x);
        }
        else
            caut(st,m-1,x);
    }
}



int main()
{
    f=fopen("scmax.in","r");
    g=fopen("scmax.out","w");


    fscanf(f,"%d",&n);
    for (i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);

    sol=1;

    for (i=1;i<=n;i++)
    {
        mx=0;
        caut(1,cn,v[i]);
        p[i]=mx+1;
        q[mx+1]=v[i];
        cn=max(cn,mx+1);
        sol=max(sol,mx+1);
    }

    fprintf(g,"%d\n",sol);
    rec(n,sol);
	return 0;
}