Pagini recente » Cod sursa (job #748957) | Cod sursa (job #2156347) | Cod sursa (job #115778) | Cod sursa (job #486304) | Cod sursa (job #2254317)
#include <fstream>
#include <vector>
#define dim 100002
#define inf 2000000001
using namespace std;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
int v[dim], p[dim], q[dim],l, n;
vector <int> ans;
/*int insereaza()
{
int pas = 1;
while (pas <= l)
pas *= 2;
int r = 1;
while (pas > 0)
{
if ( pas + r <= l && v[q[pas + r]] < val)
r += pas;
pas /= 2;
}
int poz = 0;
if (i >= 2 || v[q[1]] < val)
poz = r;
q[poz + 1] = i;
p[i] = q[j];
}*/
int insereaza(int val, int st, int dr)
{
int mij = (st + dr) / 2;
if (st == dr)
{
if (dr > l)
q[++l + 1] = inf;
q[st] = val;
return st;
}
else
if (val < q[mij])
return insereaza(val, st, mij);
else
if (val > q[mij])
return insereaza(val , mij + 1, dr);
}
int main()
{
in >> n;
for (int i = 1; i <= n; i++)
in >> v[i];
l = 0;
q[1] = inf;
for (int i = 1; i <= n; i++)
p[i] = insereaza(v[i], 1, l + 1);
out << l << '\n';
for (int i = l; i; i--)
{
while (p[n] != i)
n--;
ans.push_back(v[n]);
}
for (int i = l - 1; i >= 0; i--)
out << ans[i] << " ";
return 0;
}