Pagini recente » Borderou de evaluare (job #3048961) | Cod sursa (job #650814) | Monitorul de evaluare | Cod sursa (job #650805) | Cod sursa (job #1329280)
#include <fstream>
#include <algorithm>
#define DIM 100005
#define infile "scmax.in"
#define outfile "scmax.out"
using namespace std;
ifstream f(infile);
ofstream g(outfile);
int n;
int v[DIM], Sol[DIM], dp[DIM], t[DIM];
int main() {
f >> n;
for (int i = 1; i <= n; ++i)
f >> v[i];
int l = 0;
for (int i = 1; i <= n; ++i) {
int st = 1, dr = l, val = v[i];
bool ok = true;
while (st <= dr) {
int mid = (st + dr) / 2;
if (v[dp[mid]] == val) {
ok = false;
break;
}
if (v[dp[mid]] < val)
st = mid + 1;
else
dr = mid - 1;
}
if (!ok)
continue;
if (st == l + 1) {
dp[++l] = i;
t[i] = dp[l - 1];
}
else
if (st == 1) {
dp[1] = i;
t[i] = 0;
}
else {
dp[st] = i;
t[i] = dp[st - 1];
}
}
g << l << '\n';
int sol = 0;
for (int i = dp[l]; i; i = t[i])
Sol[++sol] = v[i];
for (int i = sol; i; --i)
g << Sol[i] << ' ';
return 0;
}
//Trust me, I'm the Doctor!