Pagini recente » Cod sursa (job #904110) | Cod sursa (job #1947604) | Cod sursa (job #1026738) | Cod sursa (job #1660688) | Cod sursa (job #2153225)
//#include <fstream>
#include <algorithm>
#include <vector>
#include <cstdlib>
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");
FILE *fin = fopen("scmax.in", "r");
//fin >> n;
fscanf(fin, "%d", &n);
for (int i = 1;i <= n;++i)
fscanf(fin, "%d", &v[i]);
//fin >> v[i];
fclose(fin);
//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;
a[0].first = -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");
FILE * fout = fopen("scmax.out", "w");
//fout << sol[0] << "\n";
fprintf(fout, "%d\n", sol[0]);
for (int i = 1;i <= sol[0];++i)
fprintf(fout, "%d ", sol[i]);
//fout << sol[i] << " ";
fclose(fout);
}
int main()
{
Read();
Normalizare();
Solve();
Write();
return 0;
}