Pagini recente » Cod sursa (job #1861473) | Cod sursa (job #3031803) | Cod sursa (job #1186797) | Cod sursa (job #2737330) | Cod sursa (job #2582513)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int v[NMAX],sclm[NMAX],n,L,poz[NMAX];
void citire()
{
f >> n;
for(int i=1;i<=n;++i)
f >> v[i];
}
int cauta(int st,int dr,int val)
{
if(st == dr)return st;
else
{
int mid = (st + dr)/2;
if(val < sclm[mid])
return cauta(st,mid,val);
else /* val >= sclm[mid] */
return cauta(mid+1,dr,val);
}
}
void sol()
{
for(int i=1;i<=n;++i)
{
if(L == 0 || v[i] > sclm[L])
{
L++;
sclm[L] = v[i];
poz[i] = L;
}
else
{
int p = cauta(1,L,v[i]);
sclm[p] = v[i];
poz[i] = p;
}
}
int Lmax = L;
list <int> sir;
for(int i = n; i >= 1; --i)
if(poz[i] == Lmax)
{
Lmax--;
sir.push_front(v[i]);
}
g << sir.size() << '\n';
for(int i : sir)g << i << ' ';
}
int main()
{
citire();
sol();
}