Pagini recente » Istoria paginii runda/wellcodesimulareclasa9-11martie/clasament | Cod sursa (job #836732) | Istoria paginii runda/oji_9_12111/clasament | simulare.oji.2024.bv_11_12 | Cod sursa (job #3123379)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int NMAX = 1e5;
int n, m, a[NMAX + 1];
int d_ind[NMAX + 1], indD;
int previ_ind[NMAX + 1];
int rez[NMAX + 1], 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];
a[0] = -1;
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;
}