Pagini recente » Cod sursa (job #2842933) | Cod sursa (job #483898) | Cod sursa (job #552836) | Cod sursa (job #526372) | Cod sursa (job #3195836)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <climits>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int LMAX = 100005;
int v[LMAX], index[LMAX], dp[LMAX];
vector<int> ans;
int main() {
int n, i;
fin>>n;
for (i = 1; i <= n; i++) {
fin>>v[i];
}
int s, d, mij, lmax;
dp[0] = -1; //dp[i] indicele retine elementului minim cu care se termina o secventa de lungime i
lmax = 0;
for (i = 1; i <= n; i++) {
s = 0;
d = lmax + 1;
while (s + 1 != d) {
mij = ((s + d) >> 1);
if (v[dp[mij]] >= v[i]) {
d = mij;
}
else s = mij;
}
if (dp[s + 1] == 0 || v[dp[s + 1]] > v[i]) {
dp[s + 1] = i;
index[i] = dp[s];
lmax = max(lmax, s + 1);
}
}
int x = dp[lmax];
while (x != -1) {
ans.push_back(v[x]);
x = index[x];
}
fout<<lmax<<endl;
for (i = ans.size() - 1; i >= 0; i--) fout<<ans[i]<<" ";
fin.close();
fout.close();
return 0;
}