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

186 篇文章 0 订阅

Description

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

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

他会作出三种操作:

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

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

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

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

Input

第一行两个整数 n , m n,m n,m.
第二行 n n n个整数,第 i i i个整数代表 a i a_i ai的值.
接下来 m m m行,每行代表一个操作:
第一个整数 t t t代表操作的类型
t = 1 t=1 t=1,则接下来两个整数 v , x v,x v,x,代表操作 1 1 1.
t = 2 t=2 t=2,则接下来一个整数 y y y,代表操作 2 2 2.
t = 3 t=3 t=3,则接下来一个整数 q q q,代表操作 3 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) (1n,m105,1ai109,1t3,1levn,1x109,1y104,1qn)

Output

对于每个操作 3 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 res,假设当前要把第 v v v堆从 x x x变成 y y y,相当于把 a v a_v av变成 y − r e s y-res yres,查询 v v v的答案即为 a v + r e s a_v+res av+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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值