0pts 求调
查看原帖
0pts 求调
1418200
j23wuyifan楼主2025/1/29 22:33
#include<bits/stdc++.h>
using namespace std;
const int N = 5e4 + 10;
const int M = 1010;
int turn[N],Q,n,a[N],b[N],len,s,tot,L[M],R[M],sum[M][N],q[M][M],cnt[N],pos[N];
void prework() {
	for(int j = 1; j <= tot; j ++)
		for(int i = L[j]; i <= R[j]; i ++)
			sum[j][a[i]] ++;
	for(int i = 1; i <= len; i ++)
		for(int j = 1; j <= tot; j ++)
			sum[j][i] += sum[j - 1][i];
	for(int i = 1; i <= tot; i ++) 
		for(int j = i ; j <= tot; j ++) {
			q[i][j] = q[i][j - 1];
			for(int k = L[j]; k <= R[j]; k ++) {
				if(sum[j][a[k]] - sum[i - 1][a[k]] > sum[j][q[i][j]] - sum[i - 1][q[i][j]]|| (sum[j][a[k]] - sum[i - 1][a[k]] == sum[j][q[i][j]] - sum[i - 1][q[i][j]] && a[k] < q[i][j]) ) q[i][j] = a[k];
			}
		}
}
int query(int l,int r) {
	if(pos[l] == pos[r] || pos[l] + 1 == pos[r]) {
		int ans = 0;
		int j = pos[l];
		for(int i = l;i <= r;i ++) cnt[a[i]] ++;
		for(int i = l ; i <= r; i ++) 
			if(cnt[a[i]]  > cnt[ans]  || (cnt[a[i]] == cnt[ans] && a[i] < ans) ) ans = a[i];
		for(int i = l; i <= r; i++) cnt[a[i]] = 0;
		return ans;
	}
	int block = pos[l],ans = q[pos[l] + 1][pos[r] - 1],x = l;
	while(l <= R[block]) {
		cnt[a[l]] ++;
		if(cnt[a[l]] + sum[pos[r] - 1][a[l]] - sum[pos[l]][a[l]] > cnt[ans] +  sum[pos[r] - 1][ans] - sum[pos[l]][ans] || (cnt[a[l]] + sum[pos[r] - 1][a[l]] - sum[pos[l]][a[l]] > cnt[ans] +  sum[pos[r] - 1][ans] - sum[pos[l]][ans] && ans > a[l])) ans = a[l];
		l ++;
	}
	l = L[pos[r]];
	while(l <= r) {
		cnt[a[l]] ++;
		if(cnt[a[l]] + sum[pos[r] - 1][a[l]] - sum[pos[l]][a[l]] > cnt[ans] +  sum[pos[r] - 1][ans] - sum[pos[l]][ans] || (cnt[a[l]] + sum[pos[r] - 1][a[l]] - sum[pos[l]][a[l]] > cnt[ans] +  sum[pos[r] - 1][ans] - sum[pos[l]][ans] && ans > a[l])) ans = a[l];
		l ++;
	}
	for(int i = x;i <= R[block];i ++) cnt[a[i]] = 0;
	for(int i = L[pos[r]];i <= r;i ++) cnt[a[i]] = 0;
	return ans ;
}
signed main() {
	ios ::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin >> n >> Q;
	s = sqrt(n);
	tot = (n + s - 1) / s;
	L[1] = 1;
	for(int i = 2; i <= tot; i ++) L[i] = min(L[i - 1] + s,n);
	R[tot] = n;
	for(int i = 1; i < tot; i ++) R[i] = L[i + 1] - 1;
	for(int i = 1; i <= n ; i++) cin >> a[i],b[i] = a[i];
	sort(b + 1,b + n + 1);
	len = unique(b + 1,b + n + 1) - b - 1;
	for(int i = 1; i <= n ; i ++) {
		pos[i] = ceil(1.0 * i / s);
		int x = a[i];
		a[i] = lower_bound(b + 1,b +len + 1,a[i]) - b;
		turn [a[i]] = x;
	}
	int l,r,lst = 0;
	while(Q--) {
		cin >> l >> r;
		l = (l + lst - 1) % n + 1,r = (r +lst - 1) % n + 1;
		if(l > r) swap(l,r);
		lst = turn[query(l,r)];
		cout << lst << '\n';
	}
	return 0;
}
2025/1/29 22:33
加载中...