Pagini recente » Monitorul de evaluare | Cod sursa (job #1333148) | Cod sursa (job #1742445) | Cod sursa (job #738306) | Cod sursa (job #2902002)
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
struct inp {
int val;
int idx;
};
struct num {
int val;
int raw;
};
bool cmp(const inp& a, const inp& b) {
return a.val < b.val;
}
inp input[100005];
num v[100005];
int aib[100005];
int parent[100005];
int n;
vector <int> ans;
void Update(int pos, int val) {
for (; pos <= n; pos += pos & (-pos)) {
if (val > aib[pos]) {
aib[pos] = val;
}
}
}
int Query(int pos) {
int max = 0;
int index = -1;
for (; pos > 0; pos -= pos & (-pos)) {
if (v[pos].val > max) {
max = v[pos].val;
index = pos;
}
}
return index;
}
int main() {
fin >> n;
for (int i = 0; i < n; i++) {
inp newInp;
fin >> newInp.val;
newInp.idx = i + 1;
input[i] = newInp;
}
sort(input, input + n, cmp);
int currVal = 0;
int lastVal = -1;
for (int i = 0; i < n; i++) {
if (lastVal != input[i].val) {
currVal++;
lastVal = input[i].val;
}
v[input[i].idx].val = currVal;
v[input[i].idx].raw = input[i].val;
}
// for (int i = 1; i <= n; i++) {
// cout << v[i].val << ' ';
// }
// cout << '\n';
Update(1, 1);
parent[1] = 1;
for (int i = 2; i <= n; i++) {
int oldIndex = Query(i - 1);
// cout << v[oldIndex].val << ' '<< v[i].val << '\n';
if (v[oldIndex].val < v[i].val) {
Update(i, aib[oldIndex] + 1);
parent[i] = oldIndex;
}
else if (v[oldIndex].val == v[i].val){
parent[i] = parent[oldIndex];
}
else {
parent[i] = i;
}
}
// for (int i = 1; i <= n; i++) {
// cout << parent[i] << ' ';
// }
// cout << '\n';
// for (int i = 1; i <= n; i++) {
// cout << aib[i] << ' ';
// }
int ansIdx = Query(n);
// cout << '\n';
// cout << ansIdx << ' ';
fout << aib[ansIdx] << '\n';
while (parent[ansIdx] != ansIdx) {
ans.push_back(v[ansIdx].raw);
ansIdx = parent[ansIdx];
}
ans.push_back(v[ansIdx].raw);
for (int i = ans.size() - 1; i >= 0; i--) {
fout << ans[i] << ' ';
}
}