原題鏈接: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;
}