int n, m; pair<ll,int> a[N+10][100]; // [区间右端点 i][pwr] = pwr对应修改bit的 距离最近的 {线性基,下标}
boolquery(){ int l = read(); int r = read(); ll x = read(); rep(i,0,61) if ((x>>i)&1) { // x 的 i 位bit 是1 auto [base,idx] = a[r][i]; if (!base || idx < l) returnfalse; // 找不到, 或者最近的修改 超出范围 x ^= base; } returntrue; }
intmain(){ int n = read(); int q = read(); rep(pos,1,n+1) { int i = pos; ll x = read(); rep(pwr,0,61) a[pos][pwr] = a[pos-1][pwr];// 拷贝一份 rep(pwr,0,61) if ( (x>>pwr) & 1) { // x 位是1 , 这里和query的 位顺序一致即可, 可以从小到大,也可以从大到小 auto [base,idx] = a[pos][pwr]; if (!base) { // 新增基 a[pos][pwr] = {x,i}; // 基,下标 break; } elseif (i > idx) { // 换离pos更近的基 swap(a[pos][pwr].first, x); swap(a[pos][pwr].second, i); } x ^= a[pos][pwr].first; // 把pwr位的1删掉, 变换基 } } while (q--) printf("%s\n",query()?"Yes":"No"); return0; }