rt 非常感谢
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, t, q;
const ll N = 1e6 + 10;
struct Node
{
ll l, r;
ll lz;
ll c;
}tr[4 * N];
void pushup(ll u)
{
tr[u].c = tr[u << 1].c | tr[u << 1 | 1].c;
}
void pushdown(ll u)
{
if(tr[u].lz != 0)
{
tr[u << 1].c = tr[u].c;
tr[u << 1].lz = 1;
tr[u << 1 | 1].c = tr[u].c;
tr[u << 1 | 1].lz = 1;
tr[u].lz = 0;
}
}
void build(ll u, ll l, ll r)
{
tr[u] = {l, r};
if(l == r)
{
tr[u].c = 2;
return ;
}
ll mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
}
void modify(ll u, ll l, ll r, ll x)
{
if(tr[u].l >= l && tr[u].r <= r)
{
tr[u].c = 1 << x;
tr[u].lz = 1;
return ;
}else
{
pushdown(u);
ll mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) modify(u << 1, l, r, x);
if(r > mid) modify(u << 1 | 1, l, r, x);
pushup(u);
}
}
long long query(ll u, ll l, ll r)
{
if(tr[u].l >= l && tr[u].r <= r) return tr[u].c;
else
{
pushdown(u);
ll mid = l + r >> 1;
long long ans = 0;
if(l <= mid) ans |= query(u << 1, l, r);
if(r > mid) ans |= query(u << 1 | 1, l, r);
return ans;
}
}
int main()
{
cin >> n >> t >> q;
build(1, 1, n);
char op;
while(q -- )
{
cin >> op;
if(op == 'C')
{
ll a, b, c;
cin >> a >> b >> c;
if(a > b) swap(a, b);
modify(1, a, b, c);
}else
{
ll a, b;
cin >> a >> b;
if(a > b) swap(a, b);
long long s = query(1, a, b);
ll cnt = 0;
for(ll i = 1; i <= t; i ++ ) if(s & (1 << i)) cnt ++ ;
cout << cnt << endl;
}
}
return 0;
}