Pagini recente » Cod sursa (job #2036106) | Cod sursa (job #1757753) | Cod sursa (job #2794265) | Cod sursa (job #316765) | Cod sursa (job #176199)
Cod sursa(job #176199)
//Subsir crescator maximal
//Complexitate O(N logN)
#include <stdio.h>
#define INPUT "scmax.in"
#define OUTPUT "scmax.out"
#define NMAX 100001
int N;
int v[NMAX], s[NMAX], lung[NMAX], sir[NMAX];
int l;
int caut(int val)
{
int st = 0, dr = l;
while(st < dr)
{
int mij = (st+dr+1)/2;
if(s[mij] >= val) dr = mij-1;
else st = mij;
}
return st;
}
void afis()
{
printf("%d\n", l);
int i = N;
while(lung[i] != l) --i;
int ll = l;
int val = sir[l] = v[i]; --ll;
for(--i; i; --i)
if(lung[i] == ll && v[i] < val)
sir[ll] = val = v[i], --ll;
for(i = 1; i < l; ++i)
printf("%d ", sir[i]);
printf("%d\n", sir[l]);
}
int main()
{
freopen(INPUT, "r", stdin);
freopen(OUTPUT, "w", stdout);
scanf("%d", &N);
int i;
for(i = 1; i <= N; ++i)
scanf("%d", &v[i]);
s[1] = v[1];
lung[1] = 1;
l = 1;
for(i = 2; i <= N; ++i)
if(v[i] > s[l]) s[++l] = v[i], lung[i] = l;
else
{
int poz = caut(v[i]);
s[poz+1] = v[i];
lung[i] = poz+1;
}
afis();
return 0;
}