Pagini recente » Cod sursa (job #272443) | Cod sursa (job #630414) | Cod sursa (job #2907025) | Cod sursa (job #1930994) | Cod sursa (job #2035818)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
#define MAX 100000
int v[MAX + 1], dp[MAX + 1], pr[MAX + 1], BIT[MAX + 1], order[MAX + 1];
int N;
int NU;
vector<pair<int, int>> vsorted(MAX + 1);
void Update(int x, int poz)
{
for (; x <= NU; x += x ^ (x - 1) & x)
{
if (dp[BIT[x]] < dp[poz])
{
BIT[x] = poz;
}
}
}
int Query(int x)
{
int mx = 0;
for (;x; x -= x ^ (x - 1) & x)
{
if (dp[mx] < dp[BIT[x]])
{
mx = BIT[x];
}
}
return mx;
}
int main()
{
in >> N;
for (int i = 1; i <= N; i++)
{
in >> v[i];
vsorted[i] = { v[i], i };
}
stable_sort(vsorted.begin() + 1, vsorted.begin() + N + 1);
//NU = unique(vsorted + 1, vsorted + N + 1) - vsorted - 1;
//
//for (int i = 1; i <= N; i++)
//{
// order[i] = lower_bound(vsorted + 1, vsorted + NU + 1, v[i]) - vsorted;
//}
int ord = 1;
for (int i = 1; i <= N; i++)
{
if (vsorted[i].first != vsorted[ord].first)
vsorted[++ord] = vsorted[i];
order[vsorted[i].second] = ord;
}
NU = ord;
for (int i = 1; i <= N; i++)
{
int pred = pr[i] = Query(order[i] - 1);
dp[i] = dp[pred] + 1;
Update(order[i], i);
}
int max_i = Query(NU);
out << dp[max_i] << '\n';
int count = 0;
while (max_i > 0)
{
dp[count++] = max_i;
max_i = pr[max_i];
}
for (int i = count - 1; i >= 0; i--)
{
out << v[dp[i]] << ' ';
}
}