Pagini recente » Cod sursa (job #2957920) | Cod sursa (job #1965100) | Cod sursa (job #3215370) | Cod sursa (job #2126101) | Cod sursa (job #2582523)
#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, t, elementMax;
list <int> sir;
// caut ultimul nr din SCLM
t = n;
while(t >= 1 && poz[t] != Lmax)t--;
elementMax = v[t];
Lmax--;
sir.push_front(elementMax);
// caut restul nr din SCLM
while(t >= 1 && Lmax > 0)
{
if(poz[t] == Lmax && v[t] < elementMax)
{
Lmax--;
elementMax = v[t];
sir.push_front(elementMax);
}
t--;
}
g << sir.size() << '\n';
for(int i : sir)g << i << ' ';
}
int main()
{
citire();
sol();
}