Pagini recente » Cod sursa (job #1076378) | Cod sursa (job #3216701) | Cod sursa (job #2549692) | Cod sursa (job #2844122) | Cod sursa (job #2573741)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
//AUR CURAT: https://stackoverflow.com/questions/2631726/how-to-determine-the-longest-increasing-subsequence-using-dynamic-programming
int a[100001], s[100001], sol[100001], p[100001];
int k;
int cb(int ind)
{
//caut a[s[k]] minim, a.i. a[s[k]] >= a[ind] (si daca am a[s[k]] minim, atunci am si k minim)
int st = 1, dr = k, mij;
while (st<=dr)
{
mij = (st+dr)>>1;
if (a[s[mij]] >= a[ind])
dr = mij - 1;
else
st = mij + 1;
}
return st;
}
int main()
{
int i, n, j, poz;
fin >> n;
for (i = 1; i<=n; i++)
fin >> a[i];
s[1] = 1;
k = 1;
for (i = 2; i<=n; i++)
{
if (a[i] > a[s[k]])
{
p[i] = s[k];
k++;
s[k] = i;
}
else
{
poz = cb(i);
p[i] = s[poz-1];
s[poz] = i;
}
}
fout << k << '\n';
for (i = 1, j = s[k]; i<=k; i++, j = p[j])
sol[i] = j;
for (i = k; i>=1; i--)
fout << a[sol[i]] << ' ';
return 0;
}