Pagini recente » Cod sursa (job #2331503) | Cod sursa (job #1554860) | Cod sursa (job #2810964) | Cod sursa (job #801095) | Cod sursa (job #1017056)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
vector<int> q;
int a[100010];
int p[100010];
int prec[100010];
int last[100010];
int n, best, bestpoz;
void citire()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", a+i);
}
int inser(int y)
{
int st = 0, dr = q.size(), mij;
int x = a[y];
while(st < dr)
{
mij = (st+dr) / 2;
if(q[mij] < x)
st = mij + 1;
else if(q[mij] >= x)
dr = mij;
}
if(st < q.size())
{
q[st] = x;
return st;
}
q.push_back(x);
return q.size()-1;
}
void afisare(int x)
{
if(x == 0)
return;
afisare(prec[x]);
printf("%d ", a[x]);
}
void solve()
{
int i, j, poz;
for(i = 1; i <= n; i++)
{
poz = inser(i) + 1;
p[i] = poz;
last[poz] = i;
prec[i] = last[poz-1];
if(poz > best)
{
best = poz;
bestpoz = i;
}
}
printf("%d\n", best);
afisare(last[best]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
citire();
solve();
return 0;
}