您的位置:首页 > 其它

2018年全国多校算法寒假训练营练习比赛(第五场)B Big Water Problem

2018-03-19 13:12 471 查看
链接:https://www.nowcoder.com/acm/contest/77/B
来源:牛客网
给一个数列,会有多次询问,对于每一次询问,会有两种操作:
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的和,保证数据合法。
输出描述:
输出每次求和的结果并换行
示例1
输入
10 2
1 2 3 4 5 6 7 89 10
1 1 9
2 1 10
输出
64
就是一道树状数组的裸题,直接使用树状数组的知识往上套就好了#include<iostream>
using namespace std;

int num[100003];
long long c[100003];
int lowbit(int t)
{
return t&(-t);
}
void insert(int k, int d, int max)
{
while (k <= max)
{
c[k] += d;
k = k + lowbit(k);
}
}
long long getsum(int k)
{
long long t = 0;
while (k > 0)
{
t += c[k];
k -= lowbit(k);
}
return t;
}
int main()
{
int n,m;
int a, _c, b;
cin >> n>>m;

for (int i = 0; i <= n; i++) c[i] = 0;
for (int i = 1; i <= n; i++)
{
cin >> num[i];
insert(i, num[i], n);
}
for (int i = 0; i < m; i++)
{
cin >> a >> b >> _c;
if (a == 1)
{
insert(b, _c, n);
}
if (a == 2)
{
cout << getsum(_c) - getsum(b - 1)<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐