poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)
2024-08-25 16:27:11
/*
树状数组第三种模板(改段求段)不解释!
不明白的点这里:here!
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 100005
using namespace std; typedef long long LL; LL ss[N], B[N], C[N]; int n, m; void addB(int x, int k){//B[i]表示被1...i整体一共加了多少的总和
for(int i=x; i<=n; i+=i&(-i)) B[i]+=x*k;
} void addC(int x, int k){//1....x节点的每个节点的增量
for(int i=x; i>; i-=i&(-i)) C[i]+=k;
} LL sumB(int x){
LL s=;
for(int i=x; i>; i-=i&(-i)) s+=B[i];
return s;
} LL sumC(int x){//x节点总共的增量
LL s=;
for(int i=x; i<=n; i+=i&(-i)) s+=C[i];
return s;
} LL sum(int x){
return x== ? : sumC(x)*x + sumB(x-);
} void update(int a, int b, int c){
addB(b, c);
addC(b, c);
if(a->){
addB(a-, -c);
addC(a-, -c);
}
} int main(){
int m;
while(scanf("%d%d", &n, &m)!=EOF){
for(int i=; i<=n; ++i){
scanf("%lld", &ss[i]);
ss[i]+=ss[i-];
}
char ch[];
int a, b, c;
while(m--){
scanf("%s", ch);
if(ch[]=='Q'){
scanf("%d%d", &a, &b);
printf("%lld\n", ss[b]-ss[a-]+sum(b)-sum(a-));
}
else{
scanf("%d%d%d", &a, &b, &c);
update(a, b, c);
}
}
}
return ;
}
最新文章
- H5+JS+CSS3 综合应用
- linux多文本替换内容
- [THINKING IN JAVA]初始化和清理
- RabbitMQ(五) -- topics
- [moka同学笔记]yii2.0小物件的简单使用(第一种方法)
- SQL Server 开发指南
- LR录制测试脚本
- MongoDB - Introduction to MongoDB, Capped Collections
- 委托、Lambda和事件
- OpenStack Newton版本Ceph集成部署记录
- COM学习(三)——COM的跨语言
- iOS开发 runtime实现原理以及实际开发中的应用
- 如何给 mongodb 设置密码
- vue 应用生产环境的 webpack 打包配置优化
- 开源的CAS实现SSO
- X86汇编语言实现的贪吃蛇游戏
- Singleton单例对象的使用
- python数据结构之动态数组
- LeetCode--066--加一
- 5 并发编程-(进程)-队列&;生产者消费者模型