求调
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;
}
这里空空如也
有帮助,赞一个