求调
2025-02-10 18:21:56
发布于:湖北
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
    int l,r,num,add;
}tree[2000005];
int n,m,k,a[200005];
void build(int l,int r,int cur){
    tree[cur].l = l;
    tree[cur].r = r;
    if(l == r){
        tree[cur].num = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(l,mid,cur * 2);
    build(mid + 1,r,cur * 2 + 1);
    tree[cur].num = tree[cur * 2].num | tree[cur * 2 + 1].num;
    return;
}
void lazy_tag(int cur){
    if(tree[cur].add){
        tree[cur * 2].num = (1 << tree[cur].num);
        tree[cur * 2 + 1].num = (1 << tree[cur].num);
        tree[cur * 2].add = tree[cur].add;
        tree[cur * 2 + 1].add = tree[cur].add;
        tree[cur].add = 0;
        return;
    }
}
void change(int cur,int l,int r,int k){
    if(tree[cur].l >= l && tree[cur].r <= r){
        tree[cur].num = (1 << k);
        tree[cur].add = k;
        return;
    }
    lazy_tag(cur);
    int mid = (tree[cur].l + tree[cur].r) >> 1;
    if(l <= mid) change(cur * 2,l,r,k);
    if(r > mid) change(cur * 2 + 1,l,r,k);
    tree[cur].num = tree[cur * 2].num | tree[cur * 2 + 1].num;
}
int query(int cur,int l,int r){
    if(tree[cur].l >= l && tree[cur].r <= r) return tree[cur].num;
    int mid = (tree[cur].l + tree[cur].r) >> 1;
    lazy_tag(cur);
    int ans = 0;
    if(l <= mid) ans |= query(cur * 2,l,mid);
    if(r > mid) ans |= query(cur * 2 + 1,mid + 1,r);
    return ans;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n >> k >> m;
    for(int i = 1;i <= n;i++) a[i] = 1;
    build(1,n,1);
    for(int i = 1;i <= m;i++){
        char op; cin >> op;
        if(op == 'C'){
            int a,b,c; cin >> a >> b >> c;
            if(a > b) swap(a,b);
            change(1,a,b,c);
        }else{
            int x,y; cin >> x >> y;
            if(x > y) swap(x,y);
            cout << __builtin_popcount(query(1,x,y)) << "\n";
        }
    }
    return 0;
}
这里空空如也












有帮助,赞一个