Pagini recente » Cod sursa (job #3181211) | Cod sursa (job #1614387) | Cod sursa (job #2449539) | Cod sursa (job #1347442) | Cod sursa (job #2237034)
//#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;
}