#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
struct Tree{
int l,r,n;
}tree[1000000];
int ans[1000000];
void build(int l,int r,int n){
tree[n].l=l;
tree[n].r=r;
tree[n].n=0;
if(l==r){
return;
}
int mid=(l+r)>>1;
build(l,mid,n*2);
build(mid+1,r,n*2+1);
}
void update(int l,int r,int i){
//cout<<l<<r<<i<<endl;
/*if(tree[i].l==r&&tree[i].r==r){
tree[i].n++;
ans[tree[i].l]=tree[i].n;
return;
}*/
if(tree[i].l==l&&tree[i].r==r){
tree[i].n++;
}else{
int mid=(tree[i].l+tree[i].r)>>1;
if(r<=mid){
update(l,r,i*2);
}else if(l>mid){
update(l,r,i*2+1);
}else{
update(l,mid,i*2);
update(mid+1,r,i*2+1);
}}
//tree[i].n=tree[i*2].n+tree[i*2+1].n;
}
void add(int x){
int i;
for(i=tree[x].l;i<=tree[x].r;i++){
ans[i]+=tree[x].n;
}
if(tree[x].l==tree[x].r)
return;
add(2*x);
add(x*2+1);
}
int main()
{
int n;
int a,b;
while(~scanf("%d",&n)&&n!=00){
build(1,n,1);
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++){
scanf("%d%d",&a,&b);
update(a,b,1);
/*for(int j=a;j<=b;j++){
ans[j]++;
}*/
}
add(1);
printf("%d",ans[1]);
for(int i=2;i<=n;i++){
printf(" %d",ans[i]);
}
cout<<endl;
}
return 0;
#include <cstdio>
#include <string.h>
using namespace std;
struct Tree{
int l,r,n;
}tree[1000000];
int ans[1000000];
void build(int l,int r,int n){
tree[n].l=l;
tree[n].r=r;
tree[n].n=0;
if(l==r){
return;
}
int mid=(l+r)>>1;
build(l,mid,n*2);
build(mid+1,r,n*2+1);
}
void update(int l,int r,int i){
//cout<<l<<r<<i<<endl;
/*if(tree[i].l==r&&tree[i].r==r){
tree[i].n++;
ans[tree[i].l]=tree[i].n;
return;
}*/
if(tree[i].l==l&&tree[i].r==r){
tree[i].n++;
}else{
int mid=(tree[i].l+tree[i].r)>>1;
if(r<=mid){
update(l,r,i*2);
}else if(l>mid){
update(l,r,i*2+1);
}else{
update(l,mid,i*2);
update(mid+1,r,i*2+1);
}}
//tree[i].n=tree[i*2].n+tree[i*2+1].n;
}
void add(int x){
int i;
for(i=tree[x].l;i<=tree[x].r;i++){
ans[i]+=tree[x].n;
}
if(tree[x].l==tree[x].r)
return;
add(2*x);
add(x*2+1);
}
int main()
{
int n;
int a,b;
while(~scanf("%d",&n)&&n!=00){
build(1,n,1);
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++){
scanf("%d%d",&a,&b);
update(a,b,1);
/*for(int j=a;j<=b;j++){
ans[j]++;
}*/
}
add(1);
printf("%d",ans[1]);
for(int i=2;i<=n;i++){
printf(" %d",ans[i]);
}
cout<<endl;
}
return 0;
}
Note out a lot of places, because I tried three methods of violence, direct line segment tree, tree-like tree, and the first two have timed out.