原题链接:nyoj123 士兵杀敌(四)
用线段树超时了,用树状数组过了#include <cstdio>
using namespace std;
#define lowbit(i) i & -i
const int MAX_M = 1000000 + 1;
int T, M;
int bit[MAX_M];
void add(int i, int x){
while(i <= M){
bit[i] += x;
i += i & -i;
}
}
int sum(int i){ //sum(i)代表第1到i项的和
int s = 0;
while(i > 0){
s += bit[i];
i -= i & -i;
}
return s;
}
int main(){
char s[6];
int l, r, x;
scanf("%d%d", &T, &M);
for(int i = 0;i < T;i ++){
scanf("%s", s);
if(s[0] == 'A'){
scanf("%d%d%d", &l, &r, &x);
add(l, x);
add(r + 1, -x); //第l个加x,第r+1个加-x
//第l项加x 对于sum来说相当于l到M所有的项都加x
//同理,第r+1项加-x 对于sum来说相当于r+1到M所有的项都加-x
//两个操作对sum来说相当于第l到r项都加上x,于是sum(l到r)存的也都x,即是那一项的值
} else {
scanf("%d", &l);
printf("%d\n", sum(l));
}
}
return 0;
}