树状数组,区间更新+单点查询
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
inline int Rint() { int x; scanf("%d", &x); return x; }
inline int max(int x, int y) { return (x>y)? x: y; }
inline int min(int x, int y) { return (x<y)? x: y; }
#define FOR(i, a, b) for(int i=(a); i<=(b); i++)
#define FORD(i,a,b) for(int i=(a);i>=(b);i--)
#define REP(x) for(int i=0; i<(x); i++)
typedef long long int64;
#define INF (1<<30)
const double eps = 1e-8;
#define bug(s) cout<<#s<<"="<<s<<" "
#define MAXN 100002
int a[MAXN];
int n; //线段 1~n
inline int lowbit(int x) { return x&(-x); }
//int getsum(int x) // 区间查询,sum[1, x]
//{
// int ret = 0;
// while(x>0) //合并区间
// {
// ret += a[x];
// x-=lowbit(x);
// }
// return ret;
//}
//void insert(int x, int v) //单点更新,[x] += v
//{
// while(x<=n) //pushup,更新到父亲
// {
// a[x] += v;
// x += lowbit(x);
// }
//}
void update(int x, int v) //区间更新,[1, x] += v
{
while(x>0) //pushdown,更新到儿子
{
a[x] += v;
x -= lowbit(x);
}
}
int query(int x) //单点查询,sum of [x]
{
int ret = 0;
while(x<=n) //统计覆盖p点的区间。所有 [1, y], y>=x 的线段。
{
ret += a[x];
x += lowbit(x);
}
return ret;
}
int main()
{
while(scanf("%d", &n)!=-1 && n)
{
memset(a, 0, sizeof(a));
REP(n)
{
int l = Rint();
int r = Rint();
update(r, 1);
update(l-1, -1);
}
REP(n)
{
if(i) putchar(' ');
printf("%d", query(i+1));
}
putchar('\n');
}
}