Cod sursa(job #1966047)

Utilizator Horia14Horia Banciu Horia14 Data 14 aprilie 2017 20:45:51
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<cstdio>
#define N_MAX 100000
using namespace std;

int v[N_MAX], T[N_MAX], R[N_MAX], n, len;
FILE *fout = fopen("scmax.out","w");

void Read()
{
    FILE *fin = fopen("scmax.in","r");
    fscanf(fin,"%d",&n);
    for(int i=0; i<n; i++)
    {
        fscanf(fin,"%d",&v[i]);
        R[i] = -1;
    }
    fclose(fin);
}

void Write_Solution(int x)
{
    if(R[x] != -1)
        Write_Solution(R[x]);
    fprintf(fout,"%d ",v[x]);
}

inline int Bsearch(int End, int s)
{
    int start, mid, len;
    start = 0;
    len = End;
    while(start <= End)
    {
        mid = (start+End)>>1;
        if(mid < len && v[T[mid]] < s && s <= v[T[mid+1]])
            return mid+1;
        else if(v[T[mid]] < s)
            start = mid + 1;
        else End = mid-1;
    }
    return -1;
}

void LongestIncreasingSubsequence()
{
    int i, index;
    T[0] = len = 0;
    for(i=1; i<n; i++)
    {
        if(v[T[0]] > v[i])
            T[0] = i;
        else if(v[T[len]] < v[i])
        {
            len++;
            T[len] = i;
            R[T[len]] = T[len-1];
        }
        else
        {
            index = Bsearch(len,v[i]);
            T[index] = i;
            R[T[index]] = T[index-1];
        }
    }
    fprintf(fout,"%d\n",len+1);
    index = T[len];
    Write_Solution(index);
    fclose(fout);
}

int main()
{
    Read();
    LongestIncreasingSubsequence();
    return 0;
}