#include <bits/stdc++.h>
using namespace std;
//~ #define int long long
string str;
int zp;
vector<pair<int, int>> segtree;
int lg = 14;
void save_to_floppy(const string &bits);
//~ void save_to_floppy(const string &bits) {
	//~ return;
//~ }
void read_array(int subtask_id, const vector<int> &v) {
	vector<pair<int, int>> srt;
	int n = v.size();
	lg = log2(2*n-1);
	for (int i = 0; i < n; i++) {
		srt.push_back({v[i], i});
	}
	sort(srt.begin(), srt.end());
	vector<int> num(n);
	for (int i = 0; i < n; i++) num[srt[i].second] = i;
	string res;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < lg; j++) {
			if ((1<<j)&num[i]) res.push_back('1');
			else res.push_back('0');
		}
	}
	//~ cout << res << endl;
	str = res;
	save_to_floppy(res);
}
vector<int> number() { //turns bits into 
	vector<int> res;
	for (int i = 0; i < (int)str.size(); i += lg) {
		int curr = 0;
		for (int j = 0; j < lg; j++) {
			if (str[i+j] == '1') curr += (1<<j);
		}
		res.push_back(curr);
	}
	return res;
}
pair<int, int> query(int l, int r, int lb = 0, int rb = zp-1, int idx = 1) {
	if (l <= lb && r >= rb) return segtree[idx];
	if (l > rb || r < lb) return {-1, -1};
	int m = (lb+rb)/2;
	pair<int, int> left = query(l, r, lb, m, idx*2);
	pair<int, int> right = query(l, r, m+1, rb, idx*2+1);
	if (left.first > right.first) return left;
	else return right;
}
std::vector<int> solve_queries(int subtask_id, int N, const std::string &bits, const std::vector<int> &a, const std::vector<int> &b) {
	vector<int> ans;
	str = bits;
	lg = log2(2*N-1);
	vector<int> info = number();
	//~ for (int i : info) cout << i << " ";
	int tmp = log2(2*N-1);
	zp = 1<<tmp;
	segtree = vector<pair<int, int>> (2*zp, {0, 0});
	//~ cout << "AA" << endl;
	for (int i = 0; i < N; i++) {
		segtree[i+zp] = {info[i], i};
	}
	//~ cout << "AA" << endl;
	for (int i = zp-1; i > 0; i--) {
		if (segtree[i*2].first > segtree[i*2+1].first) {
			segtree[i] = segtree[i*2];
		} else segtree[i] = segtree[i*2+1];
	}
	//~ cout << "AA" << endl;
	for (int q = 0; q < (int)a.size(); q++) {
		ans.push_back(query(a[q], b[q]).second);
	}
	//~ for (int i : ans) cout << i << " ";
	return ans;
}
//~ signed main() {
	//~ read_array(3, {1, 3, 2, 4, 6, 5, 9});
	//~ vector<int> a = {0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 6};
	//~ vector<int> b = {0, 1, 4, 6, 1, 2, 6, 2, 3, 3, 5, 5, 6};
	//~ read_array(3, {40, 20, 30, 10});
	//~ vector<int> a = {0, 0, 0, 0, 1, 1, 1, 2, 2, 3};
	//~ vector<int> b = {0, 1, 2, 3, 1, 2, 3, 2, 3, 3};
	//~ solve_queries(3, 4, str, a, b);
//~ }
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |