Pagini recente » Cod sursa (job #851510) | Cod sursa (job #2526839) | Cod sursa (job #2964344) | Cod sursa (job #604782) | Cod sursa (job #2175543)
#include <fstream>
#include <algorithm>
#include <map>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int last2(int x)
{
return x&(x ^ (x - 1));
}
void update(int x, int nr);
int query(int x);
int n, nr, maxim, v[100005], aux[100005], best[100005], pre[100005], aib[100005];
map<int, int> cod;
int main()
{
int i, x;
fin >> n;
for (i = 1; i <= n; i++)
{
fin >> v[i];
aux[i] = v[i];
}
sort(aux + 1, aux + 1 + n);
for (i = 1; i <= n; i++)
if (!cod[aux[i]])
cod[aux[i]] = ++nr;
for (i = 1; i <= n; i++)
aux[i] = cod[v[i]];
for (i = 1; i <= n; i++)
{
pre[i] = query(aux[i] - 1);
best[i] = 1 + best[pre[i]];
update(aux[i], i);
}
for (i = 1; i <= n; i++)
if (best[i] > best[maxim])
maxim = i;
nr = 0;
fout << best[maxim] << '\n';
while (maxim)
{
aux[++nr] = v[maxim];
maxim = pre[maxim];
}
for (i = nr; i >= 1;i--)
fout << aux[i]<< ' ';
fout << '\n';
return 0;
}
void update(int x, int nr)
{
for (; x <= n; x += last2(x))
aib[x] = nr;
}
int query(int x)
{
int maxim=0;
for (; x >= 1; x -= last2(x))
if (best[aib[x]] > best[maxim])
maxim = aib[x];
return maxim;
}