Pagini recente » Cod sursa (job #218408) | Cod sursa (job #2785027) | Cod sursa (job #3145462) | Cod sursa (job #2955988) | Cod sursa (job #2522588)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int main() {
int n;
in >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) in >> a[i];
vector<int> best(n, -1);
vector<int> r(n+1, -1);
r[1] = 0;
int pos = 1;
for (int i = 1; i < n; ++i) {
if (a[i] > a[r[pos]]) {
best[i] = r[pos];
r[++pos] = i;
} else {
int left = 1, right = pos;
int place = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (mid == 1) {
if (a[i] < a[r[1]]) {
place = 1;
break;
}
left = mid+1;
}
if (a[i] == a[r[mid-1]]) break;
else if (a[r[mid-1]] > a[i]) right = mid-1;
else if (a[i] > a[r[mid-1]]) {
if (a[i] < a[r[mid]]) {
place = mid;
break;
}
left = mid+1;
}
}
if (place != -1) {
best[i] = r[place-1];
r[place] = i;
}
}
}
out << pos << "\n";
vector<int> sol;
int crr = r[pos];
while(crr != -1) {
sol.push_back(a[crr]);
crr = best[crr];
}
for (int i = sol.size()-1; i >= 0; --i)
out << sol[i] << " ";
}