Pagini recente » Cod sursa (job #1583280) | Cod sursa (job #675566) | Cod sursa (job #218972) | Cod sursa (job #1464091) | Cod sursa (job #818943)
Cod sursa(job #818943)
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MAX_N = 100100;
struct nib {
int max, val, pos;
} aib[2 * MAX_N];
int v[MAX_N];
int pd[MAX_N];
int rec[MAX_N];
int N;
stack<int> st;
void update(int pos, int val, int v);
int query(int pos, int v);
int main() {
fin >> N;
for (int i = 1; i <= N; ++i) {
fin >> v[i];
}
int result = 0, lPos = 0;
for (int i = 1; i <= N; ++i) {
pd[i] = query(i - 1, v[i]) + 1;
if (pd[i] > result) {
result = pd[i];
lPos = i;
}
update(i, pd[i], v[i]);
}
for (int i = result; i > 0; --i) {
st.push(lPos);
lPos = rec[lPos];
}
fout << result << '\n';
while (!st.empty()) {
fout << v[st.top()] << ' ';
st.pop();
}
return 0;
}
void update(int pos, int val, int v) {
for (int i = pos; i <= N; i += (i & -i)) {
aib[i].max = val;
aib[i].val = v;
aib[i].pos = pos;
}
}
int query(int pos, int v) {
int result = 0;
for (int i = pos; i > 0; i -= (i & -i)) {
if (aib[i].max > result && aib[i].val < v) {
result = aib[i].max;
rec[pos + 1] = aib[i].pos;
}
}
return result;
}