数列操作问题
Case Time Limit:1000MS
Description
假设有一列数{Ai}(1≤i≤n),支持如下两种操作:
将Ak的值加D。(k, D是输入的数)
输出As+As+1+…+At。(s, t都是输入的数,S≤T)
Input
第一行一个整数n,
第二行为n个整数,表示{Ai}的初始值≤10000。
第三行为一个整数m,表示操作数
下接m行,每行描述一个操作,有如下两种情况:
ADD k d (表示将Ak加d,1<=k<=n,d为数,d的绝对值不超过10000)
SUM s t (表示输出As+…+At)
Output
对于每一个SUM提问,输出结果
Sample Input
5
1 2 3 2 4
5
SUM 1 2
SUM 1 5
ADD 1 2
SUM 1 2
SUM 1 5
Sample Output
3
12
5
14
Hint
M,N<=100000
#include <stdio.h>
int n, c[100009];
int lowbit(int x)
{
return x&(-x);
}
int main()
{
int m, data;
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
scanf("%d", &data);
for(int j=i; j<=n; j+=lowbit(j)) c[j]+=data;
}
scanf("%d", &m);
char sel[10];
int sum;
int s, t, k, d;
for(int i=1; i<=m; i++)
{
scanf("%s", sel);
if('S'==sel[0])
{
scanf("%d%d", &s, &t);
sum=0;
for(int j=t; j; j-=lowbit(j)) sum+=c[j];
for(int j=s-1; j; j-=lowbit(j)) sum-=c[j];
printf("%d\n", sum);
}
else
{
scanf("%d%d", &k, &d);
for(int j=k; j<=n; j+=lowbit(j))c[j]+=d;
}
}
return 0;
}