Pagini recente » Cod sursa (job #1144537) | Cod sursa (job #2399075) | Cod sursa (job #3239466) | Cod sursa (job #535339) | Cod sursa (job #216956)
Cod sursa(job #216956)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
template<typename T> inline void checkMax(T &a, T &b) { a = (a > b ? a : b); }
const int MAX_N = 1024;
int n;
int a[MAX_N], d[MAX_N], b[MAX_N];
int t[MAX_N];
pair<int, int> aib[MAX_N];
void update(int poz, int val, int prov) {
int p = poz;
while (p <= n) {
checkMax(aib[p], make_pair(val, prov));
p += p ^ (p-1) & p;
}
}
pair<int, int> query(int poz) {
pair<int, int> ret = make_pair(0, 0);
while (poz) {
checkMax(ret, aib[poz]);
poz &= poz - 1;
}
return ret;
}
void write(int poz) {
if (!poz) return;
write(t[poz]);
printf("%d ", b[poz]);
}
void normalize() {
vector<int> v;
for (int i = 1; i <= n; ++i)
v.push_back(a[i]);
sort(v.begin(), v.end());
v.resize(unique(v.begin(), v.end()) - v.begin());
for (int i = 1; i <= n; ++i) {
b[i] = a[i];
a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
}
}
int main()
{
int i;
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for (i = 1; i <= n; ++i) scanf("%d", a+i);
normalize();
for (i = 1; i <= n; ++i) {
d[i] = 1; t[i] = 0;
pair<int, int> p = query(a[i]-1);
if (p.first + 1 > d[i]) {
d[i] = p.first + 1;
t[i] = p.second;
}
update(a[i], d[i], i);
}
int sol = 0;
int end = 0;
for (i = 1; i <= n; ++i)
if (d[i] > sol) {
sol = d[i];
end = i;
}
printf("%d\n", sol);
write(end);
}