给定长度为 NN 的数列 AA,然后输入 MM 行操作指令。
第一类指令形如 C l r d
,表示把数列中第 l∼rl∼r 个数都加 dd。
第二类指令形如 Q x
,表示询问数列中第 xx 个数的值。
对于每个询问,输出一个整数表示答案。
输入格式
第一行包含两个整数 NN 和 MM。
第二行包含 NN 个整数 A[i]A[i]。
接下来 MM 行表示 MM 条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
1≤N,M≤1051≤N,M≤105,
|d|≤10000|d|≤10000,
|A[i]|≤109
困难的是进行区间修改的时候,如果只区间修改,最后再查询就可以用差分解决,但这个是边修改边查询,就不能用差分了,因为查询的时候差分比较费时间。树状数组启动!和差分的思路一样,只不过用lowbit和树状数组加快了查询的过程,查询的时候就用树状数组的query进行求和会好了。
虽然感觉有些地方想不太通,但问题不大
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f3f3f3f3f
#define endl "\n"
#define lowbit(x) (x&(-x))
const int N = 1e5+10;
int a[N],tr[N];
int n,m;
void add(int x, int c){
for(int i = x; i <= n; i+=lowbit(i)) tr[i] += c;
}
int qry(int x){
int res = 0;
for(int i = x; i ; i-=lowbit(i)) res += tr[i];
return res;
}
void solve(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
add(i,a[i]-a[i-1]);
}
while(m--){
char op;
cin >> op;
if(op=='C'){
int l,r,d;
cin >> l >> r >> d;
add(l,d);
add(r+1,-d);
}
else{
int x;
cin >> x;
cout << qry(x) << endl;
}
}
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T=1;
//cin >> T;
while(T--) solve();
return 0;
}
//
//
//
//
//
标签:单点,树状,int,查询,MM,add,数组,define
From: https://blog.csdn.net/2403_85701606/article/details/144381770