题目:
题解:
这道题看着好眼熟啊
看上去很复杂,实际上就是树状数组的基本操作
单点修改区间查询:单点添加值,查找时两个区间相减就ok,但这个题是1为左区间,所以不用减
原因?答案实际上就是[1,r]的左端点数-[1,l-1]的右端点数
代码:
#include <cstdio>
using namespace std;
int n,m,c[100005],rr[100005];
void add(int loc,int v)
{
for (int i=loc;i<=n;i+=i&(-i))
c[i]+=v;
}
void addr(int loc,int v)
{
for (int i=loc;i<=n;i+=i&(-i))
rr[i]+=v;
}
int find(int loc)
{
int ans=0;
for (int i=loc;i>=1;i-=i&(-i))
ans+=c[i];
return ans;
}
int findr(int loc)
{
int ans=0;
for (int i=loc;i>=1;i-=i&(-i))
ans+=rr[i];
return ans;
}
int main()
{
int i;
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{
int q,l,r;
scanf("%d%d%d",&q,&l,&r);
if (q==1)
{
add(l,1);
addr(r,1);
}
else printf("%d\n",find(r)-findr(l-1));
}
}