Pagini recente » Cod sursa (job #2814521) | Cod sursa (job #728990) | Cod sursa (job #1768345) | Cod sursa (job #1085716) | Cod sursa (job #3356132)
#include <fstream>
#include <vector>
using namespace std;
const int INF = 2e9 + 1;
ifstream in("scmax.in");
ofstream out("scmax.out");
vector <int> x;
vector <int> lung;
vector <int> val_min;
void refac_subsirul(int p, int l, int reper) {
if (l == 0) {
return;
}
if (x[p] < reper && lung[p] == l) {
refac_subsirul(p - 1, l - 1, x[p]);
out << x[p] << " ";
} else {
refac_subsirul(p - 1, l, reper);
}
}
int caut_bin(int x) {
int st = 0, dr = (int)val_min.size() - 1, rez = st - 1;
while (st <= dr) {
int m = (st + dr) / 2;
if (val_min[m] < x) {
st = m + 1;
rez = m;
} else {
dr = m - 1;
}
}
return rez;
}
int main() {
int n, p_max = 0;
in >> n;
x.resize(n);
lung.resize(n);
for (int i = 0; i < n; i++) {
in >> x[i];
int j_0 = caut_bin(x[i]);
if (j_0 == (int)val_min.size() - 1) {
val_min.push_back(x[i]);
} else {
val_min[j_0+1] = x[i];
}
lung[i] = j_0 + 2;// in val_min pe poz j avem rez. pt subsiruri de lungime j - 1
if (lung[i] > lung[p_max]) {
p_max = i;
}
}
in.close();
out << lung[p_max] << "\n";
refac_subsirul(p_max, lung[p_max], INF);
out << "\n";
out.close();
return 0;
}