解析:
题意说的很清楚了,从a更新到b,简单的线段树区间更新问题。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ls (o<<1)
#define rs (o<<1|1)
using namespace std;
typedef long long ll;
const int N = 100005;
int sumv[N<<2], addv[N<<2];
int n;
void pushUp(int o) {
sumv[o] = sumv[ls] + sumv[rs];
}
void pushDown(int o, int L, int R) {
if(addv[o]) {
int M = (L+R)/2;
sumv[ls] += (M-L+1)*addv[o];
addv[ls] += addv[o];
sumv[rs] += (R-M)*addv[o];
addv[rs] += addv[o];
addv[o] = 0;
}
}
void build(int o, int L, int R) {
addv[o] = 0;
if(L == R) {
sumv[o] = addv[o] = 0;
return ;
}
int M = (L+R)/2;
build(ls, L, M);
build(rs, M+1, R);
pushUp(o);
}
int ql, qr;
void modify(int o, int L, int R) {
if(ql <= L && R <= qr) {
sumv[o] += (R-L+1);
addv[o]++;
return ;
}
pushDown(o, L, R);
int M = (L+R)/2;
if(ql <= M) modify(ls, L, M);
if(qr > M) modify(rs, M+1, R);
pushUp(o);
}
void query(int o, int L, int R) {
if(L == R) {
printf("%d", sumv[o]);
if(L != n) putchar(' ');
return ;
}
pushDown(o, L, R);
int M = (L+R)/2;
query(ls, L, M);
query(rs, M+1, R);
}
int main() {
//freopen("in.txt", "r", stdin);
while(scanf("%d", &n) != EOF && n) {
build(1, 1, n);
for(int i = 0; i < n; i++) {
scanf("%d%d", &ql, &qr);
modify(1, 1, n);
}
query(1, 1, n);
puts("");
}
return 0;
}