Pagini recente » Cod sursa (job #1227821) | Cod sursa (job #886007) | Cod sursa (job #2153184)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
const int DIM = 100010;
int aib[DIM];
int n, v[DIM], dp[DIM];
pair <int, int> a[DIM];
pair <int, int> b[DIM];
int frecv[DIM];
int elmax = -1;
int Max = -1;
vector <int> sol;
void Read()
{
ifstream fin("scmax.in");
fin >> n;
for (int i = 1;i <= n;++i)
fin >> v[i];
fin.close();
}
void Normalizare()
{
for (int i = 1;i <= n;++i)
a[i] = make_pair(v[i], i);
sort(a + 1, a + n + 1);
int val = 0;
for (int i = 1;i <= n;++i)
{
if (a[i].first != a[i - 1].first)
b[i] = make_pair(a[i].second, ++val);
else
b[i] = make_pair(a[i].second, val);
}
elmax = val;
sort(b + 1, b + n + 1);
}
void Update(int pos, int val)
{
for (int i = pos;i <= elmax;i += (i & (-i)))
aib[i] = max(aib[i], val);
}
int Query(int val)
{
int ret = -1;
for (int i = val;i >= 1;i -= (i & (-i)))
ret = max(ret, aib[i]);
return ret;
}
void Solve()
{
for (int i = 1;i <= n;++i)
{
dp[i] = 1 + Query(b[i].second - 1);
Update(b[i].second, dp[i]);
}
int x = -1;
for (int i = 1;i <= n;++i)
x = max(x, dp[i]);
for (int i = n;i >= 1;--i)
{
if (x == dp[i])
{
sol.push_back(v[i]);
--x;
}
}
reverse(sol.begin(), sol.end());
}
void Write()
{
ofstream fout("scmax.out");
fout << (int)sol.size() << "\n";
for (auto i : sol)
fout << i << " ";
fout.close();
}
int main()
{
Read();
Normalizare();
Solve();
Write();
return 0;
}