选数异或(线段树)

https://www.dotcpp.com/oj/problem2665.html

代码

#include <bits/stdc++.h>
using namespace std;
int n, m, x, loc[1919810];

int mx[400005];
int g[100005];

void build(int l, int r, int pos)
{
	if (l == r)
	{
		loc[g[l]] = l, mx[pos] = loc[g[l] ^ x];			
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, 2 * pos), build(mid + 1, r, 2 * pos + 1);
	mx[pos] = max(mx[2 * pos], mx[2 * pos + 1]);
}
int query(int l, int r, int pos, int L, int R)
{
	if (L <= l && r <= R) return mx[pos];
	int mid = (l + r) >> 1, ans = 0;
	if (L <= mid) ans = max(ans, query(l, mid, 2 * pos, L, R));
	if (mid < R) ans = max(ans, query(mid + 1, r, 2 * pos + 1, L, R));
	return ans;
}


int main()
{
	cin >> n >> m >> x;
	for(int i = 1; i <= n; i++) {
	    cin >> g[i];
	}
	build(1, n, 1);
	while (m--)
	{
		int l, r;
		scanf("%d%d", &l, &r);
		if (query(1, n, 1, l, r) >= l) puts("yes"); else puts("no");
	}
	return 0;
}
posted @ 2023-09-05 16:06  铜锣湾陈昊男  阅读(15)  评论(0)    收藏  举报