题目背景
炎炎夏日还没有过去,Agent
们没有一个想出去外面搞事情的。每当ENLIGHTENED总部
组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕
了。只有不咕鸟Lyn_king
一个人冒着太阳等了半个多小时,然后居然看到连ENLIGHTENED行动参谋
都咕咕咕
了,果然咕咕咕
是人类的本性啊。
题目描述
作为一个ENLIGHTENED行动指挥
,自然不想看到这一点,于是他偷取到了那些经常咕咕咕
的Agent
的在下来NN天的活动安排表
,并且叫上了你来整理。在整理过程中,ENLIGHTENED行动指挥
对你说了MM条命令,命令操作如下。
- 输入0,a,b0,a,b,这代表在第aa天到第bb天,有一名
Agent
要咕咕咕。 - 输入11 aa,这代表
ENLIGHTENED行动指挥
询问你根据目前的信息,在第aa天有多少名Agent
会咕咕咕。
作为同是不咕鸟的你,也想要惩戒那些经常咕咕咕
的人,所以,请协助完成ENLIGHTENED行动指挥
完成整理,并且在他每次询问时,输出正确的答案。
输入格式
第一行输入两个整数输N,MN,M, 下来MM行,每行输入一个命令,命令格式见题目描述。
输出格式
对于每一次询问的操作,都要输出询问的答案。答案之间用换行隔开。
输入输出样例
输入 #1复制
5 5 0 1 2 0 1 5 1 1 0 3 5 1 5
输出 #1复制
2 2
说明/提示
对于20\%20%的数据 N,M \leq 10N,M≤10
对于40\%40%的数据 N,M \leq 10^3N,M≤103
对于60\%60%的数据 N,M \leq 10^5N,M≤105
对于100\%100%的数据 1 \leq a,b \leq N \leq 10^7,M \leq 4*10^51≤a,b≤N≤107,M≤4∗105
思路
题目描述总结起来就是要实现区间修改&单点查询。
那不就是树状数组模版2吗。
当然也可以线段树做。
#include <stdio.h>
#include <iostream>
using namespace std;
int bit[10000001],a[10000001],n,m,s;
inline int lowbit(int x)
{
return x&-x;
}
inline void update(int x,int k)
{
while(x<=n)
{
bit[x]+=k;
x+=lowbit(x);
}
}
inline int sum(int k)
{
register int i(0);
while(k>0)
{
i+=bit[k];
k-=lowbit(k);
}
return i;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int i,j;
cin>>n>>m;
for(i=1;i<=m;i++)
{
int Case,x,y,z;
cin>>Case;
if(Case==0)
{
cin>>x>>y;
update(x,1);//差分思想
update(y+1,-1);
}
if(Case==1)
{
cin>>x;
cout<<sum(x)<<endl;
}
}
return 0;
}