Pagini recente » Cod sursa (job #2213541) | Cod sursa (job #135877) | Cod sursa (job #2870372) | Cod sursa (job #3030775) | Cod sursa (job #2575740)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int maxn = 100005;
int aint[maxn * 4];
map <int, int> mp;
vector <int> sol;
int dp[maxn];
int v[maxn];
int a[maxn];
void update(int nod, int st, int dr, int poz, int val)
{
if(poz < st || poz > dr)
return;
if(st == dr)
{
aint[nod] = val;
return;
}
int mij = (st + dr) / 2;
update(nod * 2, st, mij, poz, val);
update(nod * 2 + 1, mij + 1, dr, poz, val);
aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}
int query(int nod, int st, int dr, int x, int y)
{
if(y < st || x > dr)
return 0;
if(x <= st && dr <= y)
return aint[nod];
int mij = (st + dr) / 2;
int a = query(nod * 2, st, mij, x, y);
int b = query(nod * 2 + 1, mij + 1, dr, x, y);
return a + b;
}
int main()
{
int n;
in >> n;
for(int i = 1; i <= n; i++)
{
in >> v[i];
a[i] = v[i];
}
sort(a + 1, a + n + 1);
int cnt = 0;
for(int i = 1; i <= n; i++)
if(a[i] != a[i - 1])
mp[a[i]] = ++cnt;
for(int i = 1; i <= n; i++)
a[i] = v[i];
for(int i = 1; i <= n; i++)
v[i] = mp[v[i]];
for(int i = 1; i <= n; i++)
{
dp[i] = query(1, 1, n, 1, v[i] - 1) + 1;
update(1, 1, n, dp[i], 1);
}
int mx = 0;
int p = 0;
for(int i = 1; i <= n; i++)
{
if(mx < dp[i])
{
mx = dp[i];
p = i;
}
}
out << mx << "\n";
for(int i = mx; i >= 1; i--)
{
sol.push_back(a[p]);
int act = p - 1;
while(dp[act] != dp[p] - 1 && v[act] >= v[p])
act--;
p = act;
}
reverse(sol.begin(), sol.end());
for(auto it : sol)
out << it << " ";
out << "\n";
return 0;
}