Pagini recente » Cod sursa (job #2102205) | Cod sursa (job #2205522) | Cod sursa (job #2749167) | Cod sursa (job #1672055) | Cod sursa (job #2306400)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int VALMAX = 2e+9;
int lungc, submax, n, v[100002], ml[100002], rez[100002], lungmax[100002];
int cb(int val, int pozmax)
{
int st, dr, med, last;
st = 1;
dr = pozmax;
last = 0;
while (st <= dr)
{
med = (st + dr) / 2;
if (ml[med] < val)
{
last = med;
st = med + 1;
}
else dr = med - 1;
}
return last;
}
int main()
{
fin>>n;
for (int i=1; i<=n; i++)
{
fin>>v[i];
ml[i] = VALMAX + 1;
}
for (int i=1; i<=n; i++)
{
lungc = cb(v[i], submax);
if (ml[lungc+1] > v[i]) ml[lungc+1] = v[i];
lungmax[i] = lungc + 1;
if (lungc+1 > submax) submax = lungc+1;
}
int lelemc = submax, nr = 0;
for (int i=n; i>=1; i--)
if (lelemc == lungmax[i])
{
rez[++nr] = v[i];
lelemc--;
}
fout<<submax<<"\n";
for (int i=nr; i>=1; i--)
fout<<rez[i]<<" ";
return 0;
}