输入描述
第一行:输入两个数 n,q,表示给定数组的长度和操作数
第二行:输入n个数,表示长度为n的给定数组
接下来q行:每行输入表示如题的某一种操作
输出描述
对于每个2操作,输出对应结果
输入样例
3 21 2 31 1 3 12 2
输出样例
3
数据描述
1≤�,�≤1061≤n,q≤106
∣��∣≤106∣ai∣≤106
对于输入:保证1≤�≤�≤�,∣�∣≤1061≤l≤r≤n,∣k∣≤106
数据保证,输入的所有数字均为整数。
代码
#include<iostream>
using namespace std;
long long n,x,b[1000005],c[1000005],q,opt,L,R,k;
#define lb(x) (x&(-x))
void update(int x,int y){
for(int i=x;i<=n;i+=lb(i)) c[i]+=y;
}
long long ask(int x){
long long ans=0;
for(int i=x;i;i-=lb(i)) ans+=c[i];
return ans;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++) {
cin>>x;
update(i,x),update(i+1,-x);
}
while(q--){
cin>>opt;
if(opt==1){
cin>>L>>R>>k;
update(L,k),update(R+1,-k);
}
else{
cin>>k;
cout<<ask(k)<<"\n";
}
}
return 0;
}

被折叠的 条评论
为什么被折叠?



