Pagini recente » Cod sursa (job #2795386) | Cod sursa (job #2866032) | Istoria paginii runda/onicontest | Cod sursa (job #275251) | Cod sursa (job #3033071)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
vector < long long > v;
vector < long long > poz;
vector < int > lung;
int caut_bin(vector < long long > v, int n, int val)
{
int st = 1, dr = n, rez = st - 1;
while(st <= dr)
{
int m = (st + dr) / 2;
if(v[m] < val)
{
rez = m;
st = m + 1;
}
else
{
dr = m - 1;
}
}
return rez;
}
void afisare(int p, int val, int lg)
{
if(lg == 0)
{
return;
}
if(v[p] <= val && lung[p] == lg)
{
afisare(p - 1, v[p] - 1, lg - 1);
cout << v[p] << " ";
}
else
{
afisare(p - 1, val, lg);
}
}
int main()
{
v.resize(100001);
poz.resize(100001);
lung.resize(100001);
int n;
cin >> n;
for(int i = 1 ; i <= n; i++)
{
cin >> v[i];
}
int nr = 0, pmax = 1;
for(int i = 1; i <= n; i++)
{
int l = caut_bin(poz, nr, v[i]);
if(l == nr)
{
nr++;
}
poz[l + 1] = v[i];
lung[i] = l + 1;
if(lung[i] > lung[pmax])
{
pmax = i;
}
}
cout << nr << '\n';
afisare(pmax, v[pmax], lung[pmax]);
return 0;
}