Pagini recente » Cod sursa (job #1854389) | Cod sursa (job #287965) | Cod sursa (job #2934669) | Cod sursa (job #3260071) | Cod sursa (job #1373477)
#include <fstream>
using namespace std;
ofstream out ("scmax.out");
const int kNMax = 100010;
int n, val[kNMax], v[kNMax], dp[kNMax], nr;
int sol, poz_final, tata[kNMax];
void Citire() {
ifstream in("scmax.in");
in >> n;
for (int i = 1; i <= n; ++i)
in >> val[i];
in.close();
}
int CautBin(int x) {
int st = 0, dr = nr, mij = (st + dr) / 2;
while (st <= dr) {
if(val[v[mij]] >= x)
dr = mij - 1;
else
st = mij + 1;
mij = (st + dr) / 2;
}
return mij;
}
void Solve() {
int poz;
nr = 1;
dp[1] = 1;
v[1] = 1;
for (int i = 1; i <= n; ++i) {
poz = CautBin(val[i]);
dp[i] = poz + 1;
tata[i] = v[poz];
if (v[poz + 1] == 0 || val[v[poz + 1]] > val[i])
v[poz + 1] = i;
nr = max(nr, poz + 1);
if (sol < dp[i]) {
sol = dp[i];
poz_final = i;
}
}
}
void AfisRecurenta(int i) {
if(tata[i])
AfisRecurenta(tata[i]);
out << val[i] << ' ';
}
void Afisare() {
out << sol << '\n';
AfisRecurenta(poz_final);
out.close();
}
int main() {
Citire();
Solve();
Afisare();
return 0;
}