#include <cstdio>
using namespace std;
/*区间修改。
* 但是统计求和当成了单点。
* add(a)相当于从a加到n。sub(b)相当于从b减到n。
*/
const int kMax = 1e6 + 10;
int n;
int num[kMax];
inline int lowbit(int x) { return x & -x; }
int getsum(int x) {
int res = 0;
for(;x;x -= lowbit(x)) {
res += num[x];
}
return res;
}
void add(int x) {
for(;x <= n;x += lowbit(x)) {
++ num[x];
}
}
void sub(int x) {
for(;x <= n;x += lowbit(x)) {
-- num[x];
}
}
int main() {
int a, b;
scanf("%d", &n);
for(int i = 1;i <= n;++ i) {
scanf("%d%d", &a, &b);
add(a);
sub(b + 1);
}
for(int i = 1;i <= n;++ i) {
if(i > 1) printf(" ");
printf("%d", getsum(i));
}
printf("\n");
return 0;
}
树状数组之区间修改(统计变单点)
最新推荐文章于 2024-03-26 11:11:19 发布