Pagini recente » Borderou de evaluare (job #1514578) | Cod sursa (job #2807412) | Cod sursa (job #3300981) | Cod sursa (job #1474627) | Cod sursa (job #3355973)
#include <fstream>
#include <vector>
using namespace std;
void refac_subsir(int p, int lungime, vector <int> &x, vector <int> &lung, int v_min, ofstream &out) {
if (lungime == 0) {
return;
}
if (lung[p] == lungime && x[p] <= v_min) {
refac_subsir(p - 1, lungime - 1, x, lung, x[p] - 1, out);
out << x[p] << " ";
} else {
refac_subsir(p - 1, lungime, x, lung, v_min, out);
}
}
int caut_bin(vector <int> &v_min, int x_i) {
int n = (int)v_min.size() - 1;
int st = 1, dr = n, rez = st - 1;
while (st <= dr) {
int m = (st + dr) / 2;
if (v_min[m] < x_i) {
rez = m;
st = m + 1;
} else {
dr = m - 1;
}
}
return rez;
}
int main() {
ifstream in("scmax.in");
ofstream out("scmax.out");
int n;
in >> n;
vector <int> x(n);
vector <int> lung(n, 0);
vector <int> val_min;
val_min.reserve(n + 1);
val_min.push_back(-1); // doar ca sa am vectorul indexat de la 1
int p_max = 0;
for (int i = 0; i < n; i++) {
in >> x[i];
int k = caut_bin(val_min, x[i]);
lung[i] = 1 + k;
if (k == (int)val_min.size() - 1) {
val_min.push_back(x[i]);
} else {
val_min[k+1] = x[i];
}
if (lung[i] > lung[p_max]) {
p_max = i;
}
}
in.close();
out << lung[p_max] << "\n";
refac_subsir(p_max, lung[p_max], x, lung, x[p_max], out);
out << "\n";
out.close();
return 0;
}