题目背景
炎炎夏日还没有过去,Agent
们没有一个想出去外面搞事情的。每当ENLIGHTENED总部
组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕
了。只有不咕鸟Lyn_king
一个人冒着太阳等了半个多小时,然后居然看到连ENLIGHTENED行动参谋
都咕咕咕
了,果然咕咕咕
是人类的本性啊。
题目描述
作为一个ENLIGHTENED行动指挥
,自然不想看到这一点,于是他偷取到了那些经常咕咕咕
的Agent
的在下来NN天的活动安排表
,并且叫上了你来整理。在整理过程中,ENLIGHTENED行动指挥
对你说了MM条命令,命令操作如下。
- 输入$0$ $a$ $b$,这代表在第$a$天到第$b$天,有一名
Agent
要咕咕咕。 - 输入11 aa,这代表
ENLIGHTENED行动指挥
询问你根据目前的信息,在第aa天有多少名Agent
会咕咕咕。
作为同是不咕鸟的你,也想要惩戒那些经常咕咕咕
的人,所以,请协助完成ENLIGHTENED行动指挥
完成整理,并且在他每次询问时,输出正确的答案。
输入输出格式
输入格式:
第一行输入两个整数输N,MN,M, 下来MM行,每行输入一个命令,命令格式见题目描述。
输出格式:
对于每一次询问的操作,都要输出询问的答案。答案之间用换行隔开。
输入输出样例
说明
对于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
/*第一思路:线段树,数据范围是1e7感觉要mle,或许可以用树状数组搞一下 第二思路:前缀和维护差分序列,但最多支持10次询问,感觉也要gg*/ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; int tree[10000011],num[10000011]; int lowbit(int t){ return t&(-t); } void change(int x,int opt){ for(int i=x;i<=n;i+=lowbit(i)) tree[i]+=opt; } int query(int x){ int bns=0; for(int i=x;i>0;i-=lowbit(i)) bns+=tree[i]; return bns; } int main(){ scanf("%d%d",&n,&m); /*思路二 45分*/ /*for(int i=1;i<=m;i++){ int opt;scanf("%d",&opt); if(opt==0){ int x,y; scanf("%d%d",&x,&y); num[x]+=1;num[y+1]-=1; } else if(opt==1){ int x;scanf("%d",&x); for(int i=1;i<=x;i++) sum[i]=sum[i-1]+num[i]; cout<<sum[x]<<endl; } }*/ /*思路一 100*/ for(int i=1;i<=m;i++){ int opt;scanf("%d",&opt); if(opt==0){ int x,y;scanf("%d%d",&x,&y); change(x,1); change(y+1,-1); } else if(opt==1){ int x;scanf("%d",&x); cout<<query(x)<<endl; } } }