Pagini recente » Monitorul de evaluare | Borderou de evaluare (job #988194) | Borderou de evaluare (job #3102681) | Borderou de evaluare (job #3319415) | Cod sursa (job #3318754)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[100001];
int d[100001];
int poz[100001];
int pred[100001];
int main() {
const int INF = 2000000000;
int n;
fin >> n;
for(int i = 1; i <= n; i++) {
fin >> v[i];
d[i] = INF;
}
int lung = 0;
for(int i = 1; i <= n; i++) {
int a = lower_bound(d + 1, d + lung + 1, v[i]) - d;
d[a] = v[i];
poz[a] = i;
pred[i] = (a > 1 ? poz[a - 1] : 0);
if (a > lung) lung = a;
}
fout << lung << '\n';
vector<int> sol;
int x = poz[lung];
while (x) {
sol.push_back(v[x]);
x = pred[x];
}
reverse(sol.begin(), sol.end());
for (int val : sol)
fout << val << " ";
return 0;
}