Pagini recente » Cod sursa (job #1672392) | Cod sursa (job #1351653) | Cod sursa (job #1580066) | Cod sursa (job #39718) | Cod sursa (job #2018149)
# include <iostream>
# include <fstream>
# include <cmath>
# define DIM 100003
# define MAX 2147483647
using namespace std;
int n, v[DIM], a[4 * DIM], b[DIM], bs, ps, l[DIM];
void update(int k, int st, int dr, int p, int w) {
if (st == dr) {
if (v[a[k]] > v[w] || a[k] == 0) {
a[k] = w;
}
return;
}
int mid = (st + dr) / 2;
if (p <= mid) {
update(2 * k, st, mid, p, w);
} else {
update(2 * k + 1, mid + 1, dr, p, w);
}
if (v[a[2 * k]] < v[a[2 * k + 1]]) {
a[k] = a[2 * k];
} else {
a[k] = a[2 * k + 1];
}
}
int query(int k, int st, int dr, int w) {
if (st == dr) {
if (v[a[k]] < w) {
return a[k];
}
return 0;
}
int mid = (st + dr) / 2;
if (v[a[2 * k + 1]] < w) {
return query(2 * k + 1, mid + 1, dr, w);
}
return query(2 * k, st, mid, w);
}
void read() {
ifstream fin ("scmax.in");
fin>>n;
for (int i = 1; i <= n; ++i) {
fin>>v[i];
}
}
void scmax() {
v[0] = MAX;
for (int i = 1; i <= n; ++i) {
int p = query(1, 1, n, v[i]);
l[i] = l[p] + 1;
b[i] = p;
if (bs < l[i]) {
bs = l[i];
ps = i;
}
update(1, 1, n, l[i], i);
}
}
void print() {
ofstream fout ("scmax.out");
fout<<bs<<"\n";
l[0] = 0;
while (ps) {
l[++l[0]] = v[ps];
ps = b[ps];
}
for (int i = l[0]; i; --i) {
fout<<l[i]<<" ";
}
}
int main() {
read();
scmax();
print();
return 0;
}