版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/83109639
Description
这天,可爱的小托米得到了n堆积木,且第i堆积木初始时有ai块积木.
小托米很快就喜欢上了玩积木.
他会作出三种操作:
1.把第 堆的积木数量更改为 .
2.在每堆积木的上面都加上 个积木.
3.数第 堆积木的积木个数.
由于这天可爱的小托米实在是太困了,所以他请你帮他完成这些操作.
Input
第一行两个整数
.
第二行
个整数,第
个整数代表
的值.
接下来
行,每行代表一个操作:
第一个整数
代表操作的类型
若
,则接下来两个整数
,代表操作
.
若
,则接下来一个整数
,代表操作
.
若
,则接下来一个整数
,代表操作
.
Output
对于每个操作 ,输出其对应的答案.
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
维护每堆加的值 ,假设当前要把第 堆从 变成 ,相当于把 变成 ,查询 的答案即为
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;
}