Pagini recente » Cod sursa (job #2191135) | Cod sursa (job #1541983) | Cod sursa (job #2962373) | Cod sursa (job #2596323) | Cod sursa (job #1889361)
#include <cstdio>
using namespace std;
const int nmx = 100002;
int n,v[nmx];
int dp[nmx],bin[nmx],ant[nmx],t,maxim,pos;
void citire()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &v[i]);
}
void algoritm()
{
dp[1] = 1;
bin[1] = 1;
ant[1] = 0;
t = 1;
for(int i = 2; i <= n; ++i)
{
if(v[i] > v[bin[t]])
{
++ t;
bin[t] = i;
ant[i] = bin[t-1];
dp[i] = t;
}
else
{
int st = 1, dr = t;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(v[bin[mij]] >= v[i] && v[bin[mij-1]] < v[i])
{
bin[mij] = i;
ant[i] = bin[mij-1];
dp[i] = mij;
dr = st - 1;
}
else if(v[bin[mij-1]] >= v[i])
dr = mij - 1;
else
st = mij + 1;
}
}
if(maxim < dp[i])
{
maxim = dp[i];
pos = i;
}
}
}
void recursiv(int p)
{
if(ant[p])
recursiv(ant[p]);
printf("%d ", v[p]);
}
void afish()
{
printf("%d\n", maxim);
recursiv(pos);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
citire();
algoritm();
afish();
return 0;
}