Pagini recente » Cod sursa (job #880873) | Cod sursa (job #2883318) | Cod sursa (job #2351333) | Cod sursa (job #3201719) | Cod sursa (job #1786866)
#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);
}