Pagini recente » Cod sursa (job #2832313) | Cod sursa (job #1267535) | Cod sursa (job #1920496) | Cod sursa (job #910171) | Cod sursa (job #1770205)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int maxn = 100005;
vector <int> sol;
int lg[maxn];
int F[maxn];
int w[maxn];
int v[maxn];
int nr;
int cautbin(int x)
{
int st = 1;
int dr = nr;
int ret = 0;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(v[w[mij]] > x)
{
ret = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
return ret;
}
int main()
{
int n;
in >> n;
for(int i = 1; i <= n; i++)
in >> v[i];
lg[1] = 1;
w[1] = 1;
for(int i = 2; i <= n; i++)
{
if(v[i] > v[w[nr]])
{
F[i] = w[nr];
w[++nr] = i;
lg[i] = nr;
}
else if(v[i] < w[nr])
{
int poz = cautbin(v[i]);
F[i] = w[poz - 1];
w[poz] = i;
lg[i] = poz;
}
}
out << nr << "\n";
int act = 0;
for(int i = 1; i <= n; i++)
{
if(lg[i] == nr)
{
act = i;
break;
}
}
while(act != 0)
{
sol.push_back(v[act]);
act = F[act];
}
reverse(sol.begin(), sol.end());
for(auto it : sol)
out << it << " ";
out << "\n";
return 0;
}