Pagini recente » Cod sursa (job #3000812) | Cod sursa (job #166936) | Cod sursa (job #1492095) | Cod sursa (job #227313) | Cod sursa (job #3123383)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int NMAX = 1e5;
int n, m, a[NMAX + 5];
int d_ind[NMAX + 5], indD;
int previ_ind[NMAX + 5];
int rez[NMAX + 5], indrez;
int CB(int value)
{
int st = 1, dr = indD, poz = 0;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (a[d_ind[mij]] >= value)
poz = mij, dr = mij - 1;
else
st = mij + 1;
}
return poz;
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
{
if (a[i] > a[d_ind[indD]])
{
previ_ind[i] = d_ind[indD];
d_ind[++indD] = i;
}
else
{
int poz = CB(a[i]);
previ_ind[i] = d_ind[poz - 1];
d_ind[poz] = i;
}
}
indrez = indD;
for (int i = d_ind[indD]; i > 0; i = previ_ind[i], indrez--)
rez[indrez] = a[i];
cout << indD << '\n';
for (int i = 1; i <= indD; i++)
cout << rez[i] << ' ';
return 0;
}