This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
typedef long long ll;
typedef pair<ll, ll> ii;
typedef vector<ll> vi;
#include "meetings.h"
const int MAX = 750005;
struct Segtree {	// point upd, range max
	int sz;
	vi vals;
	Segtree(int N) {
		sz = 1;
		while (sz < N)
			sz *= 2;
		vals = vi(2 * sz, 0LL);
	}
	void upd(int pos, ll val, int id, int left, int right) {
		if (right - left == 1) {
			vals[id] = val;
			return;
		}
		int mid = (left + right) / 2;
		if (pos < mid)
			upd(pos, val, 2 * id + 1, left, mid);
		else
			upd(pos, val, 2 * id + 2, mid, right);
		vals[id] = max(vals[2 * id + 1], vals[2 * id + 2]);
	}
	void upd(int pos, ll val) {
		upd(pos, val, 0, 0, sz);
	}
	ll query(int qleft, int qright, int id, int left, int right) {
		if (qleft <= left && right <= qright)
			return vals[id];
		if (qright <= left || right <= qleft)
			return 0;
		int mid = (left + right) / 2;
		ll s1 = query(qleft, qright, 2 * id + 1, left, mid);
		ll s2 = query(qleft, qright, 2 * id + 2, mid, right);
		return max(s1, s2);
	}
	ll query(int qleft, int qright) {
		return query(qleft, qright, 0, 0, sz);
	}
};
vi minimum_costs(vector<int> H_g, vector<int> L_g, vector<int> R_g) {
	int N = H_g.size();
	vi H(N);
	for (int i = 0; i < N; i++) {
		H[i] = H_g[i];
	}
	int Q = L_g.size();
	vector<ii> queries;
	for (int i = 0; i < Q; i++) {
		queries.pb({L_g[i], R_g[i]});
	}
	vi maxl(N, 0);
	int curr = 1;
	for (int i = 0; i < N; i++) {
		if (H[i] == 2) {
			maxl[i] = 0;
			curr = 1;
		}
		else {
			maxl[i] = curr;
			curr++;
		}
	}
	for (int i = N - 2; i >= 0; i--) {
		if (maxl[i] != 0)
			maxl[i] = max(maxl[i], maxl[i + 1]);
	}
/*	cout<<"maxl: ";
	for (int x : maxl)
		cout<<x<<" ";
	cout<<endl;*/
	Segtree st(N);
	for (int i = 0; i < N; i++) {
		st.upd(i, maxl[i]);
	}
	set<int> all2;
	for (int i = 0; i < N; i++) {
		if (H[i] == 2)
			all2.insert(i);
	}
	vi ans(Q, -1);
	for (int i = 0; i < Q; i++) {
//		cout<<"at "<<i<<endl;
		int L = queries[i].fi;
		int R = queries[i].se;
//		cout<<"L, R: "<<L<<" "<<R<<endl;
		auto it = all2.lower_bound(L);
		if (it == all2.end() || (*it) > R) {	// no bad
			ans[i] = R - L + 1;
			continue;
		}
		auto it2 = --all2.lower_bound(R + 1);
		int p1 = *it;
		int p2 = *it2;
//		cout<<"p1, p2: "<<p1<<" "<<p2<<endl;
		ll maxc = max(p1 - L, R - p2);
		maxc = max(maxc, st.query(p1, p2 + 1));
//		cout<<"maxc: "<<maxc<<endl;
		ans[i] = 2 * (R - L + 1) - maxc;
	}
	return ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |