社区讨论

p8377求调1wa6re

学术版参与者 2已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lo21pnme
此快照首次捕获于
2023/10/23 06:33
2 年前
此快照最后确认于
2023/11/03 06:56
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;

}

回复

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

正在加载回复...