Pagini recente » Cod sursa (job #848463) | Cod sursa (job #2488888) | Cod sursa (job #1525963) | Cod sursa (job #1778588) | Cod sursa (job #222081)
Cod sursa(job #222081)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
const int N_MAX = 100010;
pair <int, int> v[N_MAX];
int aib[N_MAX], mxpoz[N_MAX], din[N_MAX], prec[N_MAX], vec[N_MAX], sol[N_MAX];
int rez, pz, N;
inline int MAX(int a, int b)
{
return (a > b ? a : b);
}
int tata(int x)
{
return x + (x ^ (x & (x - 1)));
}
void update(int poz, int val, int init)
{
while (poz <= N) {
if (val > aib[poz]) {
aib[poz] = val;
mxpoz[poz] = init;
}
poz = tata(poz);
}
}
void query(int poz)
{
while (poz > 0) {
if (aib[poz] > rez) {
rez = MAX(rez, aib[poz]);
pz = mxpoz[poz];
}
poz = poz & (poz - 1);
}
}
int main()
{
freopen("scmax.in", "r", stdin);
#ifndef _SCREEN_
freopen("scmax.out", "w", stdout);
#endif
int x;
scanf("%d\n", &N);
for (int i = 1; i <= N; i ++) {
scanf("%d ", &x);
vec[i] = x;
v[i] = make_pair(x, i);
}
sort(v + 1, v + N + 1);
din[v[1].second] = 1;
prec[v[1].second] = 0;
update(v[1].second, 1, v[1].second);
for (int i = 2; i <= N; i ++) {
if (v[i].first != v[i - 1].first) {
rez = 0, pz = 0;
if (v[i].second - 1 >= 1) query(v[i].second - 1);
else rez = 0, pz = 0;
// printf("rez = %d pz = %d\n", rez, pz);
din[v[i].second] = rez + 1;
prec[v[i].second] = pz;
// printf("%d %d %d\n", v[i].second, din[v[i].second], v[i].second);
update(v[i].second, din[v[i].second], v[i].second);
}
}
int fin = 0, ult = 0;
for (int i = 1; i <= N; i ++) {
if (din[i] > fin) {
fin = din[i];
ult = i;
}
}
printf("%d\n", fin);
while (ult != 0) {
sol[++ sol[0]] = vec[ult];
ult = prec[ult];
}
for (int i = sol[0]; i >= 1; i --) printf("%d ", sol[i]);
printf("\n");
return 0;
}