比赛 期末考试0 评测结果 ATTTTTTTTT
题目名称 我能在摸鱼被发现的情况下躲避教练的视奸吗 最终得分 10
用户昵称 对立猫猫对立 运行时间 27.928 s
代码语言 C++ 内存使用 12.54 MiB
提交时间 2026-02-07 09:24:21
显示代码纯文本
#include <bits/stdc++.h>
#define int unsigned int
using namespace std;
inline int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
struct bloc {
    int data[500005];
    int size;
    int type;
    int belong[500005];
    int sum[500005];
    void init(int n) {
        size = sqrt(n);
        for(int i = 1; i <= n; i++) {
            belong[i] = (i + size - 1) / size;
        }
        memset(sum, 0, sizeof(sum));
        if(type == 2) {
            for(int i = 1; i <= belong[n]; i++) {
                sum[i] = ~0;
            }
        }
    }
    void build(int n) {
        switch (type) {
            case 1: {
                for(int i = 1; i <= n; i++) {
                    if(sum[belong[i]] == 0) sum[belong[i]] = data[i];
                    else sum[belong[i]] = __gcd(sum[belong[i]], data[i]);
                }
                break;
            }
            case 2: {
                for(int i = 1; i <= n; i++) {
                    sum[belong[i]] &= data[i];
                }
                break;
            }
            case 3: {
                for(int i = 1; i <= n; i++) {
                    sum[belong[i]] |= data[i];
                }
                break;
            }
        }
    }
    int query(int l, int r) {
        int ans;
        switch (type) {
            case 1: {
                ans = 0;
                break;
            }
            case 2: {
                ans = ~0;
                break;
            }
            case 3: {
                ans = 0;
                break;
            }
        }
        int bl = belong[l], br = belong[r];
        if(bl == br) {
            if(type == 1) {
                ans = data[l];
            }
            for(int i = l; i <= r; i++) {
                switch (type) {
                    case 1: {
                        ans = __gcd(ans, data[i]);
                        break;
                    }
                    case 2: {
                        ans &= data[i];
                        break;
                    }
                    case 3: {
                        ans |= data[i];
                        break;
                    }
                }
            }
        } else {
            if(type == 1) {
                ans = data[l];
            }
            for(int i = l; i <= bl * size; i++) {
                switch (type) {
                    case 1: {
                        ans = __gcd(ans, data[i]);
                        break;
                    }
                    case 2: {
                        ans &= data[i];
                        break;
                    }
                    case 3: {
                        ans |= data[i];
                        break;
                    }
                }
            }
            for(int i = bl + 1; i <= br - 1; i++) {
                switch (type) {
                    case 1: {
                        ans = __gcd(ans, sum[i]);
                        break;
                    }
                    case 2: {
                        ans &= sum[i];
                        break;
                    }
                    case 3: {
                        ans |= sum[i];
                        break;
                    }
                }
            }
            for(int i = (br - 1) * size + 1; i <= r; i++) {
                switch (type) {
                    case 1: {
                        ans = __gcd(ans, data[i]);
                        break;
                    }
                    case 2: {
                        ans &= data[i];
                        break;
                    }
                    case 3: {
                        ans |= data[i];
                        break;
                    }
                }
            }
        }
        return ans;
    }
};
bloc a, b, c;
int n, m;
signed main() {
    freopen("shijian.in", "r", stdin);
    freopen("shijian.out", "w", stdout);
    n = read();
    m = read();
    a.type = 2;
    b.type = 3;
    c.type = 1;
    a.init(n);
    b.init(n);
    c.init(n);
    for(int i = 1; i <= n; i++) {
        a.data[i] = read();
    }
    for(int i = 1; i <= n; i++) {
        b.data[i] = read();
    }
    for(int i = 1; i <= n; i++) {
        c.data[i] = read();
    }
    a.build(n);
    b.build(n);
    c.build(n);
    if(m <= 100000) {
        while(m--) {
            int l, r;
            l = read();
            r = read();
            int out = 0;
            for(int i = l; i <= r; i++) {
                for(int j = i; j <= r; j++) {
                    int ans = 1;
                    // cout << a.query(i, j) << " " << b.query(i, j) << " " << c.query(i, j) << "\n";
                    ans *= a.query(i, j);
                    ans *= b.query(i, j);
                    ans *= c.query(i, j);
                    out += ans;
                }
            }
            printf("%d\n", out);
        }
    }
    else {
        int out = 0;
        while(m--) {
            int l, r, ans = 0;
            l = read();
            r = read();
            int ans1 = 1;
            for(int i = l; i <= r; i++) {
                for(int j = i; j <= r; j++) {
                    ans1 *= a.query(i, j);
                    ans1 *= b.query(i, j);
                    ans1 *= c.query(i, j);
                    ans += ans1;
                }
            }
            out ^= ans;
        }
        printf("%d\n", out);
    }
}