求调样例(悬关)
查看原帖
求调样例(悬关)
326254
LonginusMonkey楼主2023/11/6 21:21
#include<bits/stdc++.h>
#define per(i,l,r) for(int i(r), i##end(l); i>=i##end; --i)
#define rep(i,l,r) for(int i(l), i##end(r); i<=i##end; ++i)
#define ll long long
#define pb push_back
using namespace std;
const int maxn = 100000+100;
int L, T, O; char opt; int a, b, c;
int tree[maxn<<2], lazy[maxn<<2];
void push_down(int index) {
	lazy[index] && (tree[index] = (tree[index]|lazy[index]), lazy[index*2]|=lazy[index], lazy[index*2+1]|=lazy[index], lazy[index] = 0);
}
int calc(int index, int ans = 0) {
	rep(i, 1, T) (index & (1<<i)) && (ans++);
	return ans;
}
void modify(int l, int r, int index, int left, int right, int col) {
	push_down(index);
	if(left <= l && r <= right) {
		lazy[index] = lazy[index] | (1<<col);
		return;
	}
	if(right < l || r < left) return;
	int mid = l + r >> 1;
	modify(l, mid, index*2, left, right, col); modify(mid+1, r, index*2+1, left, right, col);
}
int ask(int l, int r, int index, int left, int right) {
	push_down(index); 
	if(left <= l && r <= right) {
		return tree[index];
	}
	if(right < l || r < left) return 0;
	int mid = l + r >> 1;
	return ask(l, mid, index*2, left, right) | ask(mid+1, r, index*2+1, left, right);
}
int main() {
	cin >> L >> T >> O;
	modify(1, L, 1, 1, L, 1);
	rep(i, 1, O) {
		cin >> opt;
		if(opt == 'C') {
			cin >> a >> b >> c;(a>b)&&(a=a^b, b=a^b, a=a^b);
			if(a > b) swap(a, b);
			modify(1, L, 1, a, b, c);
		} else {
			cin >> a >> b; (a>b)&&(a=a^b, b=a^b, a=a^b);
			if(a > b) swap(a, b);
			cout << calc(ask(1, L, 1, a, b)) << endl;
		}
	}
	return 0;
}
2023/11/6 21:21
加载中...