比赛 |
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;
}