Cod sursa(job #2237067)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 31 august 2018 15:09:32
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
//#include <bits/stdc++.h>
#include <fstream>
#include <vector>
#include <bitset>
#include <unordered_map>
#include <algorithm>
  
using namespace std;

/********** TEMPLATE STARTS HERE ***********/
  
#define IOS ios::sync_with_stdio(false), cin.tie(0);
#define all(v) v.begin(), v.end()
#define F first
#define S second
#define pb push_back
#define test int t; cin >> t; while(t--)
#define skip continue
#define stop break
#define sz(v) v.size()
#define endl '\n'
#define PI 3.1415926535897932384626433832795
#define EPS 1e-9
#define gcd __gcd 
#define FO(i, a) for(auto & i : a)
#define debug(a) cout << #a << ": " << a << endl
#define debug1(a, l, r) FR(i, l, r) cout << a[i] << " "; cout << endl
#define SET(a, b) memset(a, b, sizeof(a));
#define refresh fflush(stdout);
  
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef vector <int> vi;
typedef vector <long long> vl;
typedef vector <pii> vii;
typedef vector <pll> vll;
  
const int INF = 0x3f3f3f3f;
const int LINF = 0x3f3f3f3f3f3f3f3f;
  
template <typename T, typename U> inline void amin(T &x, U y) { if(y < x) x = y; }
template <typename T, typename U> inline void amax(T &x, U y) { if(x < y) x = y; }
 
/*********** TEMPLATE ENDS HERE *************/

ifstream cin("scmax.in");
ofstream cout("scmax.out");

const int N = 1e5 + 7;

int v[N];
int MI[N];
int TO[N];

int poz;
int len;

void DFS(int nod)
{
	if(TO[nod])
		DFS(TO[nod]);
	cout << v[nod] << ' ';
}

void bs(int val)
{
	int st = 1;
	int dr = len;
	poz = 0;
	while(st <= dr)
	{
		int mid = (st + dr) / 2;
		if(v[MI[mid]] < val)
			poz = mid, st = mid + 1;
		else
			dr = mid - 1;
	}
}

main()
{
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++)
		cin >> v[i];
	
	int len = 1;
	
	MI[1] = 1;
	
	for(int i = 2; i <= n; i++)
	{
		if(v[i] > v[MI[len]])
		{
			len++, MI[len] = i;
			TO[i] = MI[len - 1];
			continue;
		}
		
		if(v[i] < v[MI[1]])
		{
			MI[1] = i;
			continue;
		}

		bs(v[i]);
		
		MI[poz] = i;
		
	}
	cout << len << '\n';
	
	DFS(MI[len]);
}