Pagini recente » Cod sursa (job #1396544) | Cod sursa (job #1943181) | Cod sursa (job #597790) | Cod sursa (job #2532349) | Cod sursa (job #2949352)
#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <vector>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <bitset>
#include <string>
//#include <bits/stdc++.h>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#define pb(x) push_back(x)
const int NMAX = 1e6;
int n;
int a[NMAX];
int temp[NMAX]; //in care stochez subsirurile (voi avea indicii de la nr din a[])
int r[NMAX]; //pt care voi zice de pe ce numar vin numerele
int max_len, start_sol;
void read()
{
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i];
}
int bs(int x)
{
int st = 1, dr = max_len, mid, pos=0;
while (st <= dr)
{
mid = (st + dr) / 2;
if (a[temp[mid]] < x)
st = mid + 1, pos = mid;
else
dr = mid - 1;
}
return pos;
}
void solution()
{
for (int i = 1; i <= n; ++i)
{
int ind = bs(a[i]); // imi va da indicele dupa care trebuie sa pun nr i (a[i])
//acum trebuie sa vezi daca la pus la finalul lui temp[]
if (ind + 1 > max_len)
{
max_len = ind + 1;
start_sol = i;
}
temp[ind + 1] = i;
r[i] = temp[ind];
}
vector<int> ans;
while (start_sol)
{
ans.push_back(start_sol);
start_sol = r[start_sol];
}
reverse(ans.begin(), ans.end());
cout << max_len << '\n';
for (auto i : ans)
cout << a[i] << ' ';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
read();
solution();
}