Pagini recente » Cod sursa (job #3195963) | Cod sursa (job #2169881) | Cod sursa (job #2106914) | Cod sursa (job #1179078) | Cod sursa (job #2153196)
#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 elmax = -1;
int Max = -1;
int sol[DIM];
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 = 1;
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 = 0;
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]);
sol[0] = x;
for (int i = n;i >= 1;--i)
{
if (x == dp[i])
{
sol[x] = v[i];
--x;
}
}
}
void Write()
{
ofstream fout("scmax.out");
fout << sol[0] << "\n";
for (int i = 1;i <= sol[0];++i)
fout << sol[i] << " ";
fout.close();
}
int main()
{
Read();
Normalizare();
Solve();
Write();
return 0;
}