Pagini recente » Cod sursa (job #1774630) | Cod sursa (job #1051325) | Cod sursa (job #1448896) | Cod sursa (job #2646670) | Cod sursa (job #2514521)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int nmax = 100000;
int s[nmax+1], p[nmax+1], a[nmax+1], k;
int cb(int ind)
{
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, poz;
fin >> n;
for (i = 1; i<=n; i++)
fin >> a[i];
s[0] = -1;
s[1] = 1;
p[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;
}
}
int r[nmax+1];
fout << k << '\n';
for (poz = s[k], i = 1; i<=k; i++)
{
r[i] = poz;
poz = p[poz];
}
for (i = k; i>=1; i--)
fout << a[r[i]] << ' ';
return 0;
}