Cod sursa(job #1786866)

Utilizator jason2013Andronache Riccardo jason2013 Data 23 octombrie 2016 19:51:12
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<bits/stdc++.h>
using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

const int NMax = 10;
int N;
int T[NMax], Ans[NMax], R[NMax], input[NMax];

int ceilIndex(int input[], int T[], int endd, int s)
{
    int start = 0;
    int middle;
    int len = endd;
    while(start <= endd)
    {
        middle = (start + endd ) / 2;
        if(middle < len && input[T[middle]] < s && s <= input[T[middle+1]])
            return middle+1;
        else if(input[T[middle]] < s)
            start = middle + 1;
        else
            endd = middle-1;

    }
    return -1;
}
void longestIncreasingSubSequence(int input[])
{
    for(int i = 0; i < N; i++) R[i] = -1;
    T[0] = 0;
    int len = 0;
    for(int i = 1 ; i < N; i++)
    {
        if(input[T[0]] > input[i]) T[0] = i; //if input[i] is less than 0th value of T then replace it there.
        else if(input[T[len]] < input[i])//if input[i] is greater than last value of T then append it in T
        {
            len++;
            T[len] = i;
            R[T[len]] = T[len-1];
        }
        else // do binary search to find ceiling of input[i] and put it there
        {
            int index = ceilIndex(input, T, len, input[i]);
            T[index] = i;
            R[T[index]] = T[index-1];
        }
    }

    int t_len = len;

    g<<len+1<<"\n";

    int index = T[t_len],j = t_len, i =0;
    while(index != -1)
    {
        Ans[j] = input[index];
        j --;
        index = R[index];
    }
    int  length = t_len;
    while(length >= 0)
    {
        g<<Ans[i]<<" ";
        i++;
        length--;
    }

}

int tipN(int input[])
{
    longestIncreasingSubSequence(input);
}

void read()
{
    f>>N;
    for(int i = 0; i < N; i++)
        f>>input[i];
}

int main()
{
    read();
    tipN(input);
}