Cod sursa(job #2237034)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 31 august 2018 13:52:02
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
//#include <bits/stdc++.h>
#include <fstream>
#include <vector>
#include <bitset>
#include <unordered_map>
  
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 k[N];
int bst[N];
int TO[N];

bool cmp(int x, int y)
{
	return k[x] < k[y];
}

vi temp;

int poz;

bool bs(int val)
{
	vector <int> ::iterator low;
	low = lower_bound(all(temp), val);
	poz = low - temp.begin();
	if(poz - 1 == temp.size() - 1)
		return 0;
	if(temp[poz] == val)
		return 1;
	return 0;
}


main()
{
	int n;
	cin >> n;
	
	for(int i = 1; i <= n; i++)
	{
		cin >> k[i];
		v[i] = i;
	}
	
	bst[v[1]] = 1;
	TO[v[1]] = v[1];
	
	int mx = 1;
	int start = 0;
	
	temp.pb(v[1]);
	
	sort(v + 1, v + 1 + n, cmp);
	
	for(int i = 2; i <= n; i++)
	{
		bool ok = bs(v[i]);
		
		if(poz)
		{
			if(bst[v[temp[poz - 1]]] > bst[v[i]])
				TO[v[i]] = v[temp[poz - 1]], bst[v[i]] = bst[v[temp[poz - 1]]];
		}
		
		if(ok == true)
			poz++;
		
		while(true)
		{
			if(poz == temp.size())
				break;
			if(bst[v[temp[poz]]] > bst[v[temp[poz - 1]]])
				break;
			bst[v[temp[poz]]] = bst[v[temp[poz - 1]]] + 1;
			TO[v[temp[poz]]] = v[temp[poz - 1]] + 1;
			poz++;
		}
		
		if(bst[v[i]] > mx)
			mx = bst[v[i]], start = v[i] + (ok == false);
		
		if(ok == false)
			temp.pb(v[i]);
		else
			continue;
		sort(all(temp));
	}
	
	cout << mx << endl;
}