给定一个长度为 nnn 的数列 A1,A2,⋅⋅⋅,AnA_1,A_2,···,A_nA1,A2,⋅⋅⋅,An 和一个非负整数 xxx,给定 mmm 次查询,每次询问能否从某个区间 [l,r][l,r][l,r] 中选择两个下标不同的数使得他们的异或等于 xxx。
输入格式
输入的第一行包含三个整数 n,m,xn,m,xn,m,x。
第二行包含 nnn 个整数 A1,A2,⋅⋅⋅,AnA_1,A_2,···,A_nA1,A2,⋅⋅⋅,An。
接下来 mmm 行,每行包含两个整数 li,ril_i,r_ili,ri 表示询问区间 [li,ri][l_i,r_i][li,ri]。
输出格式
对于每个询问,如果该区间内存在两个数的异或为 xxx 则输出 yes
,否则输出 no
。
数据范围
对于 20%20\%20% 的评测用例,1≤n,m≤1001≤n,m≤1001≤n,m≤100;
对于 40%40\%40% 的评测用例,1≤n,m≤10001≤n,m≤10001≤n,m≤1000;
对于所有评测用例,1≤n,m≤100000,0≤x<220,1≤li≤ri≤n,0≤Ai<2201≤n,m≤100000,0≤x<2^{20},1≤l_i≤r_i≤n,0≤A_i<2^{20}1≤n,m≤100000,0≤x<220,1≤li≤ri≤n,0≤Ai<220。
输入样例:
4 4 1
1 2 3 4
1 4
1 2
2 3
3 3
输出样例:
yes
no
yes
no
样例解释
显然整个数列中只有 2,32,32,3 的异或为 111。
#includeusing namespace std;const int N = 100010, M = (1 << 20) + 10;int n, m, x;
int last[M], g[N];int main(){scanf("%d%d%d", &n, &m, &x);int a;for(int i = 1; i <= n; i++){scanf("%d", &a);g[i] = max(g[i-1], last[a^x]);last[a] = i;}int l, r;while(m--){scanf("%d%d", &l, &r);if(g[r] >= l) puts("yes");else puts("no");}return 0;
}
上一篇:B端权限设计