P4939 Agent2

题面

炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的。每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了。只有不咕鸟Lyn_king一个人冒着太阳等了半个多小时,然后居然看到连ENLIGHTENED行动参谋咕咕咕了,果然咕咕咕是人类的本性啊。

作为一个ENLIGHTENED行动指挥,自然不想看到这一点,于是他偷取到了那些经常咕咕咕Agent的在下来\(N\)天的活动安排表,并且叫上了你来整理。在整理过程中,ENLIGHTENED行动指挥对你说了\(M\)条命令,命令操作如下。

  1. 输入\(0,a,b\),这代表在第\(a\)天到第\(b\)天,有一名Agent要咕咕咕。
  2. 输入\(1\) \(a\),这代表ENLIGHTENED行动指挥询问你根据目前的信息,在第\(a\)天有多少名Agent会咕咕咕。

作为同是不咕鸟的你,也想要惩戒那些经常咕咕咕的人,所以,请协助完成ENLIGHTENED行动指挥完成整理,并且在他每次询问时,输出正确的答案。

输入格式

第一行输入两个整数输\(N,M\)
下来\(M\)行,每行输入一个命令,命令格式见题目描述。

输出格式

对于每一次询问的操作,都要输出询问的答案。答案之间用换行隔开。

提示说明

对于\(20\%\)的数据 \(N,M \leq 10\)

对于\(40\%\)的数据 \(N,M \leq 10^3\)

对于\(60\%\)的数据 \(N,M \leq 10^5\)

对于\(100\%\)的数据 \(1 \leq a,b \leq N \leq 10^7,M \leq 4*10^5\)

简述题意

维护一个数据结构,支持以下操作:

  • 给定一个区间,给这个区间的所有元素++
  • 求一个点的值

思路

这不就是树状数组模板题吗?(不想写线段树,也许会MLE或CE)。

代码

#include <bits/stdc++.h>
using namespace std;

const int SIZE = 1e7+5;
int a[SIZE],t[SIZE];
int n,m;

int lowbit(int i){
	return i&(-i);
}

void update(int p,int v){
	while(p<=n){
		t[p]+=v;
		p+=lowbit(p);
	}
}
int query(int p){
	int res=0;
	while(p){
		res+=t[p];
		p-=lowbit(p);
	}
	return res;
}

void update(int l,int r,int v){
	update(l,v);
	update(r+1,-v);
}

int main(){
	cin>>n>>m;
	while(m--){
		int op,l,r;
		cin>>op;
		if(op==0){
			cin>>l>>r;
			update(l,r,1);
		}
		else{
			cin>>l;
			cout<<query(l)<<endl;
		}
	}
	return 0;
}
posted @ 2022-04-09 09:04  蒟蒻xiezheyuan  阅读(9)  评论(0编辑  收藏  举报