Pagini recente » Cod sursa (job #96850) | Cod sursa (job #1242670) | Cod sursa (job #2846724) | Cod sursa (job #2230055) | Cod sursa (job #1698604)
#include<fstream>
#include<algorithm>
#include<vector>
#include<string.h>
#include<stack>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int N;
int v[100010], aib[100010], l[100010], D[100010], up[100010], o[100010], sz;
stack<int> stk;
void update(int x, int v)
{
for (;x <= N;x += x&(-x))
if (D[aib[x]] < D[v])
aib[x] = v;
}
int query(int x)
{
int mx = 0;
for (;x;x -= x&(-x))
if (D[aib[x]]>D[mx])
mx = aib[x];
return mx;
}
int main()
{
in >> N;
for (int i = 1; i <= N;++i)
in >> v[i], o[i]=l[i] = v[i];
sort(v + 1, v + N + 1);
sz = 1;
for (int i = 2;i <= N;++i)
if (v[sz] != v[i])
v[++sz] = v[i];
for (int i = 1;i <= N;++i)
l[i] = lower_bound(v + 1, v + sz + 1, l[i]) - v;
for (int i = 1;i <= N;++i)
{
up[i] = query(l[i]-1);
D[i] = D[up[i]] + 1;
update(l[i], i);
}
int mx = -1, p;
for (int i = 1;i <= N;++i)
if (D[i] > mx)
mx = D[i], p = i;
out << D[p] << '\n';
while (p)
stk.push(o[p]), p = up[p];
while (stk.size())
out << stk.top() << ' ', stk.pop();
return 0;
}