真看不出哪里错了
查看原帖
真看不出哪里错了
1025329
_psycho楼主2023/8/14 15:14
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
#define int long long
int a[N], t[N << 2], lazy[N << 2];

struct TREE {
	void pushdown(int k, int m) {
		if (lazy[k]) {
			lazy[k << 1] = lazy[k];
			lazy[k << 1 | 1] = lazy[k];
			t[k << 1] = lazy[k];
			t[k << 1 | 1] = lazy[k];
			lazy[k] = 0;
		}
	}
	void pushup(int k) {
		t[k] = t[k << 1] | t[k << 1 | 1];
	}
	void build(int k, int l, int r) { //建树
		if (l == r) {
			t[k] = a[l];
		} else {
			int m = l + ((r - l) >> 1);
			build(k << 1, l, m);
			build(k << 1 | 1, m + 1, r);
			pushup(k);
		}
		return  ;
	}
	void updata(int L, int R, int v, int l, int r, int k) {//区间修改
//		int mm = r - l + 1;
//		pushdown(k, mm);
		if (L <= l && r <= R) {
			lazy[k] = (1 << v), t[k] = (1 << v);
		} else {
			int mm = r - l + 1;
			pushdown(k, mm);
			int m = l + ((r - l) >> 1);
			if (L <= m) {
				updata(L, R, v, l, m, k << 1);
			}
			if (R > m) {
				updata(L, R, v, m + 1, r, k << 1 | 1);
			}
			pushup(k);
		}
	}
	int query(int L, int R, int l, int r, int k) { //区间查询
		int mm = r - l + 1;
		pushdown(k, mm);
		if (L <= l && r <= R)return t[k];
		else {
			int res = 0;
			int mm = r - l + 1;
			pushdown(k, mm);
			int m = l + ((r - l) >> 1);
			if (L <= m) {
				res |= query(L, R, l, m, k << 1);
			}
			if (R > m) {
				res |= query(L, R, m + 1, r, k << 1 | 1);
			}
			return res;
		}
	}
} T;
int get (int a) {
	int cnt = 0;
	while (a) {
		cnt += (a & 1);
		a /= 2;
	}
	return cnt;
}
main() {
	int n, t, m;
	cin >> n >> t >> m;
	for (int i = 1; i <= n; i++) {
		a[i] = 1;
	}
	T.build(1, 1, n);
	while (m--) {
		int x, y, k;
		char opt;
		cin >> opt;
		if (opt == 'C') {
			cin >> x >> y >> k;
			if (x > y) swap(x, y);
			T.updata(x, y, k, 1, n, 1);
		} else {
			cin >> x >> y;
			if (x > y) swap(x, y);
			cout << get(T.query(x, y, 1, n, 1) ) << '\n';
		}
	}
//	cout << 2 << '\n' << 1;
	return 0;
}
/*
2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
 */
2023/8/14 15:14
加载中...