现在有一个长度为 nn 的数列 a_1, a_2, ..., a_na 接下来进行 m 次操作,每次操作可能是以下两种中的一种: 1 p k:将 a_i的值在自己的基础上加上 k。 2 p:将 a_i的值在自己的基础上乘以 2。 3 l r:计算区间 [l,r][l,r] 中每个数字之和。 请你编写一个程序,输出每次操作 3 的结果。
输入格式 第一行包含两个整数 nn 和 mm,表示数列长度和操作次数。
第二行包含 nn 个整数,表示初始的数列。
接下来 mm 行,每行包含一个操作指令。操作指令格式和题目描述一致。
输出格式 对于每个操作 3,输出一个结果,每个结果占一行。 输入输出样例 输入 #1复制 5 5 2 3 1 8 4 3 2 4 1 3 1 3 2 4 2 3 3 2 4 输出 #1复制 12 13 15 样例解释 最开始,序列是 2,3,1,8,42,3,1,8,4。
第一次操作是输出第 2\sim 42∼4 数字的和,也就是输出 3+1+8=123+1+8=12。
第二次操作是把第 33 个数字加上 11,序列变为 2,3,2,8,42,3,2,8,4。
第三次操作是输出第 2\sim 42∼4 的数字和,也就是输出 3+2+8=133+2+8=13。
第四次操作是把第 33 个数字乘以 22,序列变为 2,3,4,8,42,3,4,8,4。
第五次操作是输出第 2\sim 42∼4 的数字和,也就是输出 3+4+8=153+4+8=15。
#include<bits/stdc++.h>
using namespace std;
int a[100001],b[100001][3],c[100001],d[100001];
int main(){
int m,n;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[j];
if(c[j]==2){
cin>>b[j][1];
a[b[j][1]]=a[b[j][1]]*2;
}
if(c[j]==1){
cin>>b[j][1]>>b[j][2];
a[b[j][1]]==a[b[j][1]]+b[j][2];
}
if(c[j]==3){
cin>>b[j][1]>>b[j][2];
d[j]+=a[j][1];
cout<<d[j];
}
}
}
}