#include "stdio.h"
#include "iostream"
using namespace std;
struct node
{
int l,r,count;
}tree[3*100002];
void build_tree( int a, int b , int root )
{
tree[root].l = a ;
tree[root].r = b ;
tree[root].count = 0;
if (a == b )
{
return ;
}
int mid = (a + b ) >> 1;
build_tree(a , mid , 2*root );
build_tree(mid+1 , b , 2*root+1);
}
void update_tree(int a , int b , int root)
{
if ( tree[root].l == a && tree[root].r == b )
{
tree[root].count++;
return ;
}
if (tree[root].l == tree[root].r )
{
return ;
}
int mid = ( tree[root].l + tree[root].r ) >> 1 ;
if (b <= mid)
{
update_tree(a , b , 2*root);
}
else
if (a > mid)
{
update_tree(a , b , 2*root+1);
}
else
{
update_tree(a , mid , 2*root );
update_tree(mid+1 , b , 2*root+1);
}
}
void find_tree(int a, int root,int &e)
{
if ( tree[root].r == a && a == tree[root].l )
{
e += tree[root].count;
return ;
}
if (tree[root].l <= a && a <= tree[root].r )
{
e += tree[root].count;
}
int mid = ( tree[root].l + tree[root].r ) >> 1 ;
if ( a <= mid )
{
find_tree(a , 2*root , e);
}
else
find_tree(a ,2*root+1 , e);
}
int main(int argc, char* argv[])
{
int index,n,m,e;
while (scanf("%d",&index) && index != 0)
{
build_tree(1 , index , 1);
for(int i = 1 ; i <= index ; ++i )
{
scanf("%d%d",&n,&m);
update_tree( n , m , 1 );
}
for (i = 1 ; i <= index ; ++i )
{
e = 0 ;
find_tree(i , 1 , e);
if (i == 1)
{
printf("%d",e);
}
else
printf(" %d",e);
}
printf("\n");
}
return 0;
}
find_tree()函数其实也可以换成下面的形式
都是一样的,可以AC
void find_tree(int a, int root,int &e)
{
if (tree[root].l <= a && a <= tree[root].r )
{
e += tree[root].count;
}
if ( tree[root].r == a && a == tree[root].l )
{
//e += tree[root].count;
return ;
}
int mid = ( tree[root].l + tree[root].r ) >> 1 ;
if ( a <= mid )
{
find_tree(a , 2*root , e);
}
else
find_tree(a ,2*root+1 , e);
}