比赛 2025.6.21 评测结果 AAAAAAAAAA
题目名称 色板游戏 最终得分 100
用户昵称 健康铀 运行时间 0.580 s
代码语言 C++ 内存使用 4.85 MiB
提交时间 2025-06-21 11:35:25
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N = 100010;
int c[N<<2], lz[N<<2];

void pu(int rt) {
    c[rt] = c[rt<<1] | c[rt<<1|1]; 
}

void pd(int rt) {
    if (lz[rt]) {
        c[rt<<1] = lz[rt];
        c[rt<<1|1] = lz[rt];
        lz[rt<<1] = lz[rt];
        lz[rt<<1|1] = lz[rt];
        lz[rt] = 0;
    }
}

void bd(int l, int r, int rt) {
    lz[rt] = 0;
    if (l == r) {
        c[rt] = 1;
        return;
    }
    int m = (l+r)>>1;
    bd(l, m, rt<<1);
    bd(m+1, r, rt<<1|1);
    pu(rt);
}

void ud(int L, int R, int v, int l, int r, int rt) {
    if (L <= l && r <= R) {
        c[rt] = v;
        lz[rt] = v;
        return;
    }
    pd(rt);
    int m = (l+r)>>1;
    if (L <= m) ud(L, R, v, l, m, rt<<1);
    if (R > m) ud(L, R, v, m+1, r, rt<<1|1);
    pu(rt);
}

int qy(int L, int R, int l, int r, int rt) {
    if (L <= l && r <= R) return c[rt];
    pd(rt);
    int m = (l+r)>>1;
    int res = 0;
    if (L <= m) res |= qy(L, R, l, m, rt<<1);
    if (R > m) res |= qy(L, R, m+1, r, rt<<1|1);
    return res;
}

int main() {
    freopen("color.in", "r", stdin);
    freopen("color.out", "w", stdout);
    int L, T, O;
    scanf("%d%d%d", &L, &T, &O);
    bd(1, L, 1);
    
    while (O--) {
        char op[2];
        int a, b, v;
        scanf("%s", op);
        if (op[0] == 'C') {
            scanf("%d%d%d", &a, &b, &v);
            if (a > b) swap(a, b);
            ud(a, b, 1 << (v-1), 1, L, 1);
        } else {
            scanf("%d%d", &a, &b);
            if (a > b) swap(a, b);
            int res = qy(a, b, 1, L, 1);
            printf("%d\n", __builtin_popcount(res));
        }
    }
    return 0;
}