如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:
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;
}