Pagini recente » Cod sursa (job #2359544) | Cod sursa (job #1624552) | Cod sursa (job #369819) | Cod sursa (job #1690038) | Cod sursa (job #3302509)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
string filename = "scmax";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
const int NMAX = 1e5;
const int INF = 1e9;
int v[NMAX + 5];
int previous[NMAX + 5];
int dp[NMAX + 5];
int main() {
int n;
fin >> n;
for (int i = 1; i <= n; i++)
fin >> v[i];
v[0] = -INF;
dp[0] = 0;
int bestLength = 0;
for (int i = 1; i <= n; i++) {
int st = 1, dr = bestLength;
int ans = 0;
while (st <= dr) {
int mij = (st + dr) / 2;
if (v[i] > v[dp[mij]]) {
ans = mij;
st = mij + 1;
} else {
dr = mij - 1;
}
}
ans++;
dp[ans] = i;
previous[i] = dp[ans - 1];
bestLength = max(bestLength, ans);
}
fout << bestLength << '\n';
vector<int> ans;
int currentPos = dp[bestLength];
while (currentPos != 0) {
ans.push_back(v[currentPos]);
currentPos = previous[currentPos];
}
reverse(ans.begin(), ans.end());
for(int it : ans)
fout<<it<<' ';
fout<<'\n';
return 0;
}