题目描述
给定数组�1,�2...��a1,a2...an,进行q次操作,操作有两种:
1 l r k:将��ai ~ ��ar 每个数都加上 k;
2 l r:求��+...+��al+...+ar
输入描述
第一行:输入两个数 n,q,表示给定数组的长度和操作数
第二行:输入n个数,表示长度为n的给定数组
接下来q行:每行输入表示如题的某一种操作
输出描述
对于每个2操作,输出对应结果
输入样例
5 32 6 6 1 12 1 41 2 5 102 1 3
输出样例
1534
数据描述
1≤�,�≤1061≤n,q≤106
∣��∣≤106∣ai∣≤106
对于输入:保证1≤�≤�≤�,∣�∣≤1061≤l≤r≤n,∣k∣≤106
代码
#include<iostream>
using namespace std;
long long n,x,c1[1000005],c2[1000005],q,L,R,k;
int opt;
const int N=1e6+5;
#define lb(x) (x&(-x))
void update(int x,long long y){
for(int i=x;i<=n;i+=lb(i)) c1[i]+=y,c2[i]+=y*x;
}
long long ask(int x){
long long ans=0;
for(int i=x;i;i-=lb(i)) ans+=c1[i];
ans*=(x+1);
for(int i=x;i;i-=lb(i)) ans-=c2[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>>L>>R;
cout<<ask(R)-ask(L-1)<<"\n";
}
}
return 0;
}
608

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



