莫队+懒删除求调
查看原帖
莫队+懒删除求调
326254
LonginusMonkey楼主2023/10/30 21:41
#include<bits/stdc++.h>
using namespace std;
int arr[500100];
struct node{
	int l, r, idx, ans;
}que[500100];
int block;
bool cmp(node x, node y) {
	if(x.l / block  == y.l / block) {
		return x.r < y.r;
	}
	return x.l / block < y.l / block;
}
stack<int> sta;
bool is[500100];
int ti[500100];
bool in[500100];
void add(int index) {
	index = arr[index];
	ti[index] ++;
	if(ti[index] == 1) {
		if(in[index]) {
			is[index] = 0;
			return;
		}
		in[index] = 1;
		sta.push(index);
	}
    if(ti[index] == 2 && in[index]) {
        is[index] = 1;
    }
}
void del(int index) {
	index = arr[index];
	ti[index] --;
	if(ti[index] == 0 && in[index]) {
		is[index] = 1;
	}
	if(ti[index] == 1) {
		if(in[index]) {
			is[index] = 0;
		} else {
			sta.push(index);
		}
	}
}
bool cmp2(node x, node y) {
	return x.idx < y.idx;
}
int main() {
	int n, q; cin >> n;
	for(int i=1; i<=n; ++i) {
		cin >> arr[i];
	}
    cin>>q;
	for(int i=1; i<=q; ++i) {
		cin >> que[i].l >> que[i].r; que[i].idx = i;
	}
	block = sqrt(n);
	sort(que+1,que+1+q,cmp);
	int l = 1, r = 0;
	for(int i=1; i<=q; ++i) {
		int left = que[i].l, right = que[i].r;
		while(r>right) del(r--);
		while(r<right) add(++r);
		while(l<left) del(l++);
		while(l>left) add(--l);
		while(!sta.empty() && is[sta.top()]) {
			is[sta.top()] = 0;
			in[sta.top()] = 0;
			sta.pop();
		}
		if(sta.empty()) {
			que[i].ans = 0;
		} else {
			que[i].ans = sta.top();
		}
	}
	sort(que+1,que+1+q,cmp2);
	for(int i=1; i<=q; ++i)cout << que[i].ans<<endl;
	return 0;
}
2023/10/30 21:41
加载中...