Pagini recente » Cod sursa (job #1940563) | Cod sursa (job #2844927) | Cod sursa (job #3272357) | Cod sursa (job #1839775) | Cod sursa (job #2462297)
#include <bits/stdc++.h>
#define N 100000
#define inf 2000000010
using namespace std;
int n, a[N + 10];
int gr[N + 10];
int backpos[N + 10];
int grpos[N + 10];
int cautbin(int val)
{
int res = -1;
int l = 0, r = N - 1, m;
while(l <= r)
{
m = (l + r) / 2;
if(gr[m] >= val)
{
res = m;
r = m - 1;
}
else
{
l = m + 1;
}
}
return res;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
gr[0] = -inf;
for(int i = 1; i <= N; i++)
gr[i] = inf;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
grpos[0] = -1;
int maxgr = 0;
for(int i = 0; i < n; i++)
{
int newpos = cautbin(a[i]);
maxgr = max(maxgr, newpos);
backpos[i] = grpos[newpos - 1];
gr[newpos] = a[i];
grpos[newpos] = i;
}
vector<int> result;
result.reserve(maxgr);
int pos = grpos[maxgr];
while(pos != -1)
{
result.push_back(a[pos]);
pos = backpos[pos];
}
cout << maxgr << '\n';
for(int i = result.size() - 1; i >= 0; i--)
cout << result[i] << ' ';
return 0;
}