Newcoder 111 F.托米搭积木(水~)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/83109639

Description

这天,可爱的小托米得到了n堆积木,且第i堆积木初始时有ai块积木.

小托米很快就喜欢上了玩积木.

他会作出三种操作:

1.把第 v v 堆的积木数量更改为 x x .

2.在每堆积木的上面都加上 y y 个积木.

3.数第 q q 堆积木的积木个数.

由于这天可爱的小托米实在是太困了,所以他请你帮他完成这些操作.

Input

第一行两个整数 n , m n,m .
第二行 n n 个整数,第 i i 个整数代表 a i a_i 的值.
接下来 m m 行,每行代表一个操作:
第一个整数 t t 代表操作的类型
t = 1 t=1 ,则接下来两个整数 v , x v,x ,代表操作 1 1 .
t = 2 t=2 ,则接下来一个整数 y y ,代表操作 2 2 .
t = 3 t=3 ,则接下来一个整数 q q ,代表操作 3 3 .

( 1 n , m 1 0 5 , 1 a i 1 0 9 , 1 t 3 , 1 l e v n , 1 x 1 0 9 , 1 y 1 0 4 , 1 q n ) (1\le n,m\le 10^5,1\le a_i\le 10^9,1\le t\le 3,1le v\le n,1\le x\le 10^9,1\le y\le 10^4,1\le q\le n)

Output

对于每个操作 3 3 ,输出其对应的答案.

Sample Input

10 11
1 2 3 4 5 6 7 8 9 10
3 2
3 9
2 10
3 1
3 10
1 1 10
2 10
2 10
3 1
3 10
3 9

Sample Output

2
9
11
20
30
40
39

Solution

维护每堆加的值 r e s res ,假设当前要把第 v v 堆从 x x 变成 y y ,相当于把 a v a_v 变成 y r e s y-res ,查询 v v 的答案即为 a v + r e s a_v+res

Code

#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn=100005;
int n,m;
ll a[maxn];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	ll res=0;
	while(m--)
	{
		int op,x,y;
		scanf("%d%d",&op,&x);
		if(op==1)
		{
			scanf("%d",&y);
			a[x]=y-res;
		}
		else if(op==2)res+=x;
		else printf("%lld\n",a[x]+res);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/V5ZSQ/article/details/83109639
111