#include <iostream>
#include <vector>
using namespace std;
#define mx 400001
int cnt[mx];
int rec[mx];
// Create a segment tree
void create(int l,int r,int o,vector<int>&nums){
if(l == r){
cnt[o] = nums[l - 1];
return;
}
int m = (r - l) / 2 + l;
create(l,m,2 * o,nums);
create(m + 1,r,2 * o + 1,nums);
cnt[o] = cnt[2 * o] + cnt[2 * o + 1];
}
//Increase k value between interval L and R
void add(int i,int l,int r,int L,int R,int k){
//Full coverage
if(L <= l && R >= r){
cnt[i] += k * (r + 1 - l);
rec[i] += k;
return;
}
int m = (r - l) / 2 + l;
if(rec[i] != 0){
rec[2 * i] += rec[i];
rec[2 * i + 1] += rec[i];
cnt[2 * i] += (m - l + 1) * rec[i];
cnt[2 * i + 1] +=(r - m) * rec[i];
rec[i] = 0;
}
if(m >= L){
add(2 * i,l,m,L,R,k);
}
if(R > m){
add(2 * i + 1,m + 1,r,L,R,k);
}
cnt[i] = cnt[2 * i] + cnt[2 * i + 1];
}
//Query the sum of each interval
int query(int i,int l,int r,int L,int R){
if(L <= l && R >= r){
return cnt[i];
}
if(R < l || L > r) return 0;
if(rec[i] != 0){
int m = (r - l) / 2 + l;
rec[2 * i] += rec[i];
rec[2 * i + 1] += rec[i];
cnt[2 * i] += (m - l + 1) * rec[i];
cnt[2 * i + 1] +=(r - m) * rec[i];
rec[i] = 0;
}
int s = 0;
int m = (r - l) / 2 + l;
if(r >= L) s += query(2 * i,l,m,L,R);
if(l <= R) s += query(2 * i + 1,m + 1,r,L,R);
return s;
}
暂时将线段树的加法代码学习 乘法还未学习 其大概步骤大致相同