线段树解决区间修改,单点查询问题
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define fora(i,n) for(int i=1;i<=n;i++)
using namespace std;
const int maxn = 100000+10;
int T,n,tree[maxn<<2],x,y,ans;
void build(int left,int right, int cur)
{
if(left==right)
{
tree[cur]=0;
return ;
}
int m=left+(right-left)/2;
build(left,m,cur*2);
build(m+1,right,cur*2+1);
}
void update(int l,int r,int left, int right, int cur)//区间更新
{
if(l==left&&r==right)
{
tree[cur]+=1;
return;
}
int m=left+(right-left)/2;
if(l>m)
update(l,r,m+1,right,cur*2+1);
else if(r<=m)
update(l,r,left,m,cur*2);
else
{
update(l,m,left,m,cur*2);
update(m+1,r,m+1,right,cur*2+1);
}
}
void query(int q,int curleft,int curright,int cur)//单点查询
{
ans+=tree[cur];
if(curleft==curright)
return ;
int m=curleft+(curright-curleft)/2;
if(q<=m)
query(q,curleft,m,cur*2);
else
query(q,m+1,curright,cur*2+1);
}
int main()
{
while(scanf("%d",&n)&&n)
{
memset(tree,0,sizeof(tree));
build(1,n,1);
for(int i=1; i<=n; i++)
{
int a,b;
scanf("%d %d",&a,&b);
update(a,b,1,n,1);
}
// fora(i,4)
// printf("%d\n",tree[i]);
for(int i=1; i<=n; i++)
{
ans=0;
query(i,1,n,1);
if(i==1)
printf("%d",ans);
else
printf(" %d",ans);
}
printf("\n");
}
return 0;
}