Submission #579333

#TimeUsernameProblemLanguageResultExecution timeMemory
579333penguinhackerIndex (COCI21_index)C++14
110 / 110
594 ms137216 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ar array

const int mxN=2e5;
int n, q, a[mxN];

struct Node {
	int sum=0;
	Node *left=nullptr, *right=nullptr;
	Node(int l, int r) {
		if (l!=r) {
			int mid=(l+r)/2;
			left=new Node(l, mid);
			right=new Node(mid+1, r);
		}
	}
	Node(int x) : sum(x) {}
	Node(Node* l, Node* r) {
		assert(l&&r);
		sum=l->sum+r->sum;
		left=l;
		right=r;
	}
	Node* upd(int i, int l=1, int r=mxN) {
		if (l>i||r<i)
			return this;
		if (l==r)
			return new Node(sum+1);
		int mid=(l+r)/2;
		return new Node(left->upd(i, l, mid), right->upd(i, mid+1, r));
	}
};

vector<Node*> roots;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> q;
	roots.push_back(new Node(1, mxN));
	for (int i=0; i<n; ++i) {
		cin >> a[i];
		roots.push_back(roots.back()->upd(a[i]));
	}
	while(q--) {
		int ql, qr;
		cin >> ql >> qr, --ql, --qr;
		Node *u=roots[ql], *v=roots[qr+1];
		int l=1, r=mxN, extra=0;
		while(l<r) {
			int mid=(l+r)/2;
			int cnt=(v->right->sum)-(u->right->sum);
			if (cnt+extra>=mid+1) {
				l=mid+1;
				u=u->right, v=v->right;
			} else {
				r=mid, extra+=cnt;
				u=u->left, v=v->left;
			}
		}
		cout << l << "\n";
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...