Pagini recente » Cod sursa (job #3151371) | Cod sursa (job #2709053) | Cod sursa (job #24597) | Cod sursa (job #900419) | Cod sursa (job #3195832)
#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];
vector<int> ans, dp(LMAX, INT_MAX);
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] 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 (dp[mij] >= v[i]) {
d = mij;
}
else s = mij;
}
if (dp[s + 1] == 0 || dp[s + 1] > v[i]) {
dp[s + 1] = v[i];
index[v[i]] = dp[s];
lmax = max(lmax, s + 1);
}
}
int x = dp[lmax];
while (x != -1) {
ans.push_back(x);
x = index[x];
}
fout<<lmax<<endl;
for (i = ans.size() - 1; i >= 0; i--) fout<<ans[i]<<" ";
fin.close();
fout.close();
return 0;
}