//#include "crocodile.h"
#include<iostream>
#include<vector>
#include<queue>
#include<deque>
#include<string>
#include<fstream>
#include<algorithm>
#include <iomanip>
#include<map>
#include <set>
#include <unordered_map>
#include <stack>
#include <unordered_set>
#include <cmath>
#include <cstdint>
#define shit short int
#define ll long long
#define For(i, n) for(ll i = 0; i < (ll)n; i++)
#define ffor(i, a, n) for(ll i = (ll)a; i < (ll)n; i++)
#define rfor(i, n) for(ll i = (ll)n; i >= (ll)0; i--)
#define rffor(i, a, n) for(ll i = (ll)n; i >= (ll)a; i--)
#define vec vector
#define ff first
#define ss second
#define pb push_back
#define pii pair<ll, ll>
#define NEK 1000000000
#define mod 1000000007
#define mod2 1000000009
#define rsz resize
#define prv1 43
#define prv2 47
#define D 8
#define trav(a,x) for (auto& a: x)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define sig 0.0000001
using namespace std;
class intervalac {
int n;
vec<int> l, r, in, je, m, lp, poz;
public:
void postav(vec<int> a) {
int vel = a.size();
n = 1;
while (n < vel) n *= 2;
l.resize(2*n);
r.resize(2*n);
in.resize(2 * n);
lp.resize(2 * n, 0);
poz.resize(2 * n, 0);
m.resize(2 * n, 0);
a.resize(n);
je.resize(2 * n);
For(i, n) {
l[i + n] = i;
r[i + n] = i;
in[i + n] = 1;
je[i + n] = a[i];
poz[i + n] = i;
}
rffor(i, 1, (n - 1)) {
l[i] = l[i * 2];
r[i] = r[i * 2 + 1];
poz[i] = l[i];
in[i] = in[i * 2] + in[i * 2 + 1];
je[i] = je[i * 2] + je[i * 2 + 1];
}
}
void vynuluj_u(int a, int b, int s = 1) {
if (a > r[s] || b < l[s]) return;
if (a <= l[s] && r[s] <= b) {
in[s] = 0;
return;
}
vynuluj_u(a, b, s * 2);
vynuluj_u(a, b, s * 2 + 1);
in[s] = in[s * 2] + in[s * 2 + 1];
return;
}
void vynuluj_m(int a, int b, int s = 1) {
if (a > r[s] || b < l[s]) return;
if (a <= l[s] && r[s] <= b) {
m[s] = (-1) * NEK;
lp[s] = 0;
return;
}
vynuluj_m(a, b, s * 2);
vynuluj_m(a, b, s * 2 + 1);
if (m[s * 2] >= m[s * 2 + 1]) {
m[s] = m[s * 2];
poz[s] = poz[s * 2];
}
else {
m[s] = m[s * 2 + 1];
poz[s] = poz[s * 2 + 1];
}
return;
}
void zmen_s(int s, int k) {
s += n;
je[s] = k;
s /= 2;
while (s) {
je[s] = je[s * 2] + je[s * 2 + 1];
s /= 2;
}
return;
}
int najdi(int x, int s = 1) {
if (s >= n) return s - n;
if (in[s * 2] > x) {
return najdi(x, s * 2);
}
return najdi(x - in[s * 2], s * 2 + 1);
}
pii maxi(int a, int b, int s = 1) {
if (a > r[s] || b < l[s]) return { (-1) * NEK, 0 };
if (a <= l[s] && r[s] <= b) return { m[s], poz[s] };
if (lp[s] != 0) {
lp[s] = 0;
lp[s * 2] = 1;
lp[s * 2 + 1] = 1;
m[s * 2] = (-1) * NEK;
m[s * 2 + 1] = (-1) * NEK;
}
pii m1 = maxi(a, b, s * 2); pii m2 = maxi(a, b, s * 2 + 1);
if (m1.ff >= m2.ff) {
return m1;
}
return m2;
}
void zmen_m(int x, pii k, int s = 1) {
if (x > r[s] || x < l[s]) return;
if (x <= l[s] && r[s] <= x) {
m[s] = k.ff;
poz[s] = k.ss;
return;
}
if (lp[s] != 0) {
lp[s] = 0;
lp[s * 2] = 1;
lp[s * 2 + 1] = 1;
m[s * 2] = (-1) * NEK;
m[s * 2 + 1] = (-1) * NEK;
}
zmen_m(x, k, s * 2);
zmen_m(x, k, s * 2 + 1);
if (m[s * 2] >= m[s * 2 + 1]) {
m[s] = m[s * 2];
poz[s] = poz[s * 2];
}
else {
m[s] = m[s * 2 + 1];
poz[s] = poz[s * 2 + 1];
}
return;
}
int suc(int a, int b, int s = 1) {
if (a > r[s] || b < l[s]) return 0;
if (a <= l[s] && r[s] <= b) return je[s];
return (suc(a, b, s * 2) + suc(a, b, s * 2 + 1));
}
};
int GetBestPosition(int n, int c, int r, int k[100], int s[100], int e[100]) {
intervalac seg;
vec<int> a(n, 0);
For(i, (n-1)) {
if (k[i] > r) a[i] = 1;
}
seg.postav(a);
int maxi = 0;
int maxipoz = 0;
For(i, c) {
int p1 = seg.najdi(s[i]), p2 = seg.najdi(e[i]);
int suc = seg.suc(p1, p2 - 1);
if (suc > 0) {
seg.vynuluj_m(p1, p2);
seg.vynuluj_u(p1 + 1, p2);
seg.zmen_s(p1, 1);
}
if (suc == 0) {
pii nm = seg.maxi(p1, p2);
nm.ff++;
if (nm.ff > maxi) {
maxi = nm.ff;
maxipoz = nm.ss;
}
seg.vynuluj_u(p1 + 1, p2);
seg.zmen_m(p1, nm);
}
}
return maxipoz;
}
/*
signed main() {
int n, c, r; cin >> n >> c >> r;
int k[100], s[100], e[100];
For(i, (n - 1)) cin >> k[i];
For(i, c) cin >> s[i] >> e[i];
cout << GetBestPosition(n, c, r, k, s, e) << '\n';
return 0;
}*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |