Pagini recente » Cod sursa (job #3314443) | Cod sursa (job #2375209) | Cod sursa (job #516712) | Diferente pentru utilizator/loo_k01 intre reviziile 65 si 4 | Cod sursa (job #3312900)
#include <bits/stdc++.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, a[100005], dp[100005], ant[100005], ans = 0, poz;
vector <int> v;
int cauta (int x) {
int st = 0, dr = v.size() - 1, mij, p = -1;
while (st <= dr) {
mij = (st + dr)/2;
if (a[v[mij]] >= x) {
p = mij;
dr = mij - 1;
}
else st = mij + 1;
}
return p;
}
void drum (int p) {
if (p == 0)
return;
drum (ant[p]);
g << a[p] << ' ';
}
int main()
{
f >> n;
for (int i=1; i<=n; ++i)
f >> a[i];
v.push_back (1);
dp[1] = 1; ant[1] = 0;
for (int i=2; i<=n; ++i) {
int p = cauta (a[i]);
if (p == -1) {
v.push_back (i);
dp[i] = v.size();
ant[i] = v[ v.size()-2 ];
if (dp[i] > ans) {
ans = dp[i]; poz = i;
}
}
else {
v[p] = i;
dp[i] = p+1;
if(p == 0)
ant[i] = 0;
else
ant[i] = v[p-1];
if (dp[i] > ans) {
ans = dp[i]; poz = i;
}
}
}
g << ans << '\n';
drum (poz);
return 0;
}