社区讨论

p8377wa * 1 + re * 6求助

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo21to8k
此快照首次捕获于
2023/10/23 06:36
2 年前
此快照最后确认于
2023/11/03 06:58
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,x;
int a[100005],b[100005],ans[100005];
int bac[2000005],l,r;

struct node{
	int dat,lft,rgt;
}t[40 * 100005];

int read(){
	int x = 0,f = 1;
	char c = getchar();
	while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();}
	while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = getchar();
	return x * f;
}

void write(int x){
	if(x < 0) putchar('-'),x = -x;
	if(x > 9) write(x / 10);
	putchar(x % 10 + '0'); 
}

void make_tree(int p,int lft,int rgt){
	t[p].lft = lft,t[p].rgt = rgt;
	if(lft == rgt){
		t[p].dat = ans[lft];
		return;
	}
	
	int mid = (lft + rgt) / 2;
	make_tree(p << 1,lft,mid);
	make_tree(p << 1 + 1,mid + 1,rgt);
	t[p].dat = max(t[p << 1].dat,t[p << 1 + 1].dat);
}

int query(int p){
	int lft = t[p].lft,rgt = t[p].rgt;
	if(lft > r || rgt < l)
		return 0;
	if(lft >= l && rgt <= r)
		return t[p].dat;
	return max(query(p << 1),query(p << 1 + 1));
}

signed main(){
	n = read(),m = read(),x = read();
	for(int i = 1;i <= n;i++){
		a[i] = read();
		b[i] = a[i] ^ x;//与a[i] xor 为x的数 
		bac[a[i]] = i;//更新a[i]这个数出现的位置 
		ans[i] = bac[b[i]];//i前符合条件的数的最近位置 
	}
	
	make_tree(1,1,n);
	
	for(int i = 1;i <= m;i++){
		l = read(),r = read();
		int jud = query(1);
		if(jud >= l)
			printf("yes\n");
		else printf("no\n");
	}
	return 0;
	
}

回复

0 条回复,欢迎继续交流。

正在加载回复...