Pagini recente » Cod sursa (job #2176479) | Cod sursa (job #190143) | Cod sursa (job #715427) | Cod sursa (job #3038414) | Cod sursa (job #2945484)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define pb(x) push_back(x)
const int NMAX = 1e5 + 5;
int N, v[NMAX], temp[NMAX], r[NMAX];
int max_len, start_sol;
void read()
{
fin >> N;
for (int i = 1; i <= N; ++i)
fin >> v[i];
}
int bs(int x)
{
int st = 1, dr = max_len, mid, maybe = 0;
while (st <= dr)
{
mid = (st + dr) / 2;
if (v[temp[mid]] < x)
maybe = mid, st = mid + 1;
else
dr = mid - 1;
}
return maybe;
}
void solution()
{
for (int i = 1; i <= N; ++i)
{
int ind = bs(v[i]); //indexul nr la care il pot lega pe v[i];
if (max_len < ind + 1) //acum vezi daca trebuie sa-l pui la finalul vectorului sau nu
{
max_len = ind + 1;
start_sol = i;
}
temp[ind + 1] = i;
r[i] = temp[ind]; //pui de la cine vine (nu de la cine vine ala de la care vine)
}
fout << max_len;
vector<int> ans;
while (max_len)
{
ans.push_back(start_sol);
start_sol = r[start_sol];
max_len--;
}
reverse(ans.begin(), ans.end());
fout << '\n';
for (auto g : ans)
fout << v[g] << ' ';
}
int main()
{
ios::sync_with_stdio(false);
fin.tie(NULL);
read();
solution();
}