校门外的树*(树状数组)

如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:
K KK=1,读入l ll,r rr表示在l ll~r rr之间种上的一种树
K KK=2,读入l ll,r rr表示询问l~r之间能见到多少种树
(l ll,r rr>0)

输入
第一行n nn,m mm表示道路总长为n nn,共有m mm个操作
接下来m mm行为m mm个操作

输出
对于每个k kk=2输出一个答案

样例输入

5 4
1 1 3
2 2 5
1 2 4
2 3 5

样例输出
1
2

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int c[N], d[N];
int n, m, k, a, b;

int lowbit(int x) {
	return x & (-x);
}

void yjc1(int x, int v) {
	while (x <= n) {
		c[x] += v;
		x += lowbit(x);
	}
}

void yjc2(int x, int v) {
	while (x <= n) {
		d[x] += v;
		x += lowbit(x);
	}
}

int lyx1(int x) {
	int ans = 0;
	while (x > 0) {
		ans += c[x];
		x -= x & (-x);
	}
	return ans;
}

int lyx2(int x) {
	int ans = 0;
	while (x > 0) {
		ans += d[x];
		x -= x & (-x);
	}
	return ans;
}

int main() {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> k >> a >> b;
		if (k == 1) {
			yjc1(a, 1);
			yjc2(b, 1);
		}
		if (k == 2) {
			cout << lyx1(b) - lyx2(a - 1) << endl;
		}
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值