链接:https://www.nowcoder.com/acm/contest/77/B
来源:牛客网
Big Water Problem
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
给一个数列,会有多次询问,对于每一次询问,会有两种操作:
1:给定两个整数x, y, 然后在原数组的第x位置上加y;
2:给定两个整数l,r,然后输出数组从第l位加到第r位数字的和并换行
输入描述:
第一行有两个整数n, m(1 <= n, m <= 100000)代表数列的长度和询问的次数
第二行n个数字,对于第i个数字a[i],(0<=a[i]<=100000)。
接下来m行,每一行有三个整数f, x, y。第一个整数f是1或者是2,代表操作类型,如果是1,接下来两个数x,y代表第x的位置上加y,如果是2,则求x到y的和,保证数据合法。
输出描述:
输出每次求和的结果并换行
输入例子:
10 2
1 2 3 4 5 6 7 8 9 10
1 1 9
2 1 10
输出例子:
64
-->
示例1
输入
10 2
1 2 3 4 5 6 7 8 9 10
1 1 9
2 1 10
输出
64
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int a[];
long long s[];
int x[];
int y[];
int z[];
int main()
{
int n, q;
scanf("%d %d", &n, &q);
int i;
s[] = ;
for (i = ; i <= n; i++)
{
scanf("%d", &a[i]);
s[i] = s[i - ] + a[i];
}
int k = ;
for (i = ; i <= q; i++)
{
int e, u, v;
scanf("%d %d %d", &e, &u, &v);
int j;
long long ss = ;
if (e == )//如果是第一种情况,存下来
{
x[k] = e;
y[k] = u;
z[k++] = v;
}
if (e==)//如果是第二种情况
{
for (j = ; j <= k-; j++)//遍历第一种情况
{
if (y[j]<=v&&y[j]>=u)//如果要加的数在u和v之间
{
ss += z[j];//总和+上
}
}
ss += s[v] - s[u-];
cout << ss << endl;
} }
return ;
}