Pagini recente » Cod sursa (job #1216193) | Cod sursa (job #1577539) | Cod sursa (job #2832683) | Cod sursa (job #1632946) | Cod sursa (job #1966047)
#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;
}