Pagini recente » Cod sursa (job #761324) | Cod sursa (job #716935) | Cod sursa (job #2922119) | Cod sursa (job #2306891) | Cod sursa (job #2484632)
#include <fstream>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int n, k;
int dp[100005], v[100005], a[100005], PREV[100005], ans[100005];
int bs(int val) {
int st = 1, dr = k, mij, ans = 0;
while (st <= dr) {
mij = (st + dr) / 2;
if (a[v[mij]]< val) {
st = mij + 1;
ans = mij;
} else
dr = mij - 1;
}
return ans;
}
int main() {
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> a[i];
int j = bs(a[i]);
dp[i] = j + 1;
if (j == k)
v[++k] = i;
else if (a[v[j + 1]] > a[i])
v[j + 1] = i;
PREV[i] = v[j];
}
int poz = v[k];
k = 0;
while (poz) {
ans[++k] = a[poz];
poz = PREV[poz];
}
fout << k << '\n';
for (int i = k; i; --i)
fout << ans[i] << ' ';
return 0;
}