Pagini recente » Cod sursa (job #1211234) | Cod sursa (job #2702084) | Cod sursa (job #2751702) | Cod sursa (job #2089238) | Cod sursa (job #1785172)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int a[100001];
vector <int> q, p, sol;
vector <int>::iterator it;
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int n,poz;
scanf("%d",&n);
for (register int i = 0; i < n; ++i)
scanf("%d", &a[i]);
/*
/// lis crescator ///
q.push_back(a[0]);
p.push_back(0);
for (register int i = 1; i < n; ++i)
{
it = upper_bound(q.begin(), q.end(), a[i]);
if (it == q.end())
{
q.push_back(a[i]);
poz = q.size() -1;
p.push_back(poz);
}
else
{
poz = (int)(it - q.begin());
*it = a[i];
p.push_back(poz);
}
}
int lis = q.size();
printf("%d\n", lis);
poz = p.size() - 1;
for (register int i = lis - 1; i >= 0; --i)
for ( ; poz >= 0; --poz)
{
if (p[poz] == i)
{
sol.push_back(a[poz]);
break;
}
}
reverse(sol.begin(), sol.end());
for (register int i = 0; i < sol.size(); ++i)
printf("%d ",sol[i]);
printf("\n");
q.clear();
p.clear();
sol.clear();*/
/// lis strict crescator ///
q.push_back(a[0]);
p.push_back(0);
for (register int i = 1; i < n; ++i)
{
it = lower_bound(q.begin(), q.end(), a[i]);
if (*it == a[i])
{
poz = (int)(it - q.begin());
p.push_back(poz);
continue;
}
if (it == q.end())
{
q.push_back(a[i]);
poz = q.size() -1;
p.push_back(poz);
}
else
{
*it = a[i];
poz = (int)(it - q.begin());
p.push_back(poz);
}
}
int lis = q.size();
printf("%d\n", lis);
poz = p.size() - 1;
for (register int i = lis - 1; i >= 0; --i)
for ( ; poz >= 0; --poz)
{
if (p[poz] == i)
{
sol.push_back(a[poz]);
break;
}
}
reverse(sol.begin(), sol.end());
for (register int i = 0; i < sol.size(); ++i)
printf("%d ",sol[i]);
printf("\n");
return 0;
}