P4839求调
查看原帖
P4839求调
1074188
Secret_Ingredient楼主2023/9/9 19:32

rt,wa 10pts

#include <bits/stdc++.h>
using namespace std;

#define N 114514
#define M 1919810
#define fi first
#define se second

typedef long long ll;
typedef pair<int, int> pii;

template<typename T> inline T read() {
    T x = 0, f = 1; char ch = 0;
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
    for(; isdigit(ch); ch = getchar()) x = (x << 3) + (x << 1) + (ch - '0');
    return x * f;
}

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

template<typename T> inline void print(T x, char ed = '\n') {
    write(x), putchar(ed);
}

struct LinearBase {
    int a[33];
    LinearBase() { memset(a, 0, sizeof a); }
    void insert(int x) {
        for(int i = 32; i >= 0; -- i) {
            if(!((x >> i) & 1)) continue;
            if(!a[i]) {
                a[i] = x;
                return ;
            }
            x ^= a[i];
        }
    }
    LinearBase operator + (const LinearBase &other) const {
        LinearBase ret;
        memcpy(ret.a, a, sizeof a);
        for(int i = 32; i >= 0; -- i) 
            if(other.a[i]) ret.insert(other.a[i]);
        return ret;
    }
    int query() {
        int ret = 0;
        for(int i = 32; i >= 0; -- i) 
            ret = max(ret, (ret ^ a[i]));
        return ret;
    }
} tr[N << 2];
void pushup(int p) {
    tr[p] = tr[p << 1] + tr[p << 1 | 1];
}
void modify(int p, int l, int r, int i, int k) {
    if(l == i && r == i) {
        tr[p].insert(k);
        return ;
    }
    int mid = (l + r) >> 1;
    if(i <= mid) modify(p << 1, l, mid, i, k);
    else modify(p << 1 | 1, mid + 1, r, i, k);
    pushup(p);
}
LinearBase query(int p, int l, int r, int ql, int qr) {
    if(ql <= l && r <= qr) return tr[p];
    int mid = (l + r) >> 1;
    LinearBase ret;
    if(ql <= mid) ret = ret + query(p << 1, l, mid, ql, qr);
    if(qr > mid) ret = ret + query(p << 1 | 1, mid + 1, r, ql, qr);
    return ret;
}

int n, m;

signed main() {
    n = read<int>(), m = read<int>();
    while(n --) {
        int opt = read<int>();
        if(opt == 1) {
            int p = read<int>(), k = read<int>();
            modify(1, 1, m, p, k);
        } else {
            int l = read<int>(), r = read<int>();
            print(query(1, 1, m, l, r).query());
        }
    }
    return 0;
}
2023/9/9 19:32
加载中...