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) (1≤n,m≤105,1≤ai≤109,1≤t≤3,1lev≤n,1≤x≤109,1≤y≤104,1≤q≤n)
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 y−res,查询 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;
}