Pagini recente » Cod sursa (job #2862734) | Cod sursa (job #1870389) | Cod sursa (job #1512532) | Cod sursa (job #1182877) | Cod sursa (job #2175559)
#include <fstream>
#include <algorithm>
#include <map>
using namespace std;
FILE * fin=fopen("scmax.in","r");
FILE * fout=fopen("scmax.out","w");
inline 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;
fscanf(fin, "%d", &n);
for (i = 1; i <= n; i++)
{
fscanf(fin, "%d", &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;
fprintf(fout, "%d\n", best[maxim]);
while (maxim)
{
aux[++nr] = v[maxim];
maxim = pre[maxim];
}
for (i = nr; i >= 1;i--)
fprintf(fout, "%d ", aux[i]);
fprintf(fout, "\n");
return 0;
}
void update(int x, int nr)
{
for (; x <= n; x += last2(x))
if (best[nr] > best[aib[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;
}