1、单调更新,区间查询。
sum(i)的意思是从1-i的和。
int n;
int c1[500];
int lowbits(int x){ return x&(-x);}
int sum(int x){
int sum1=0;
while(x>0){
sum1+=c1[x];
x-=lowbits(x);
}
return sum1;
}
int add(int x,int y){ //对点x加上y值
while(x<=n){
c1[x]+=y;
x+=lowbits(x);
}
}
int main(){
//freopen("in.txt","r",stdin);
int i,j,k,f1,f2,f3,l1,l2,l3;
int m,c;
n=500; //很重要,别main里面有n外面也有,这样会错误的
memset(c1,0,sizeof(c1));
add(5,7);
add(3,3);
cout << sum(7) << endl;
return 0;
}
2、区间更新,点查询。
把上面代码的add(x,k),add(y+a,-k)就是对区间进行修改,
然后单点查询如sum(5),就是查询5这个点的值
add(5,7);
add(10+1,-7);
cout << sum(5) << endl;
3、最后是区间更新和区间查询。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
const int maxn=1e5+7;
int n,c1[maxn],c2[maxn];
int lowbits(int x){ return x&(-x);}
void add(int *r,int pos,int v){
while(pos<=n){
r[pos]+=v;
pos+=lowbits(pos);
}
}
int sigma(int *r,int pos){
int anx=0;
while(pos>0){
anx+=r[pos];
pos-=lowbits(pos);
}
return anx;
}
int main(){
freopen("in.txt","r",stdin);
int i,j,k,f1,f2,f3,t1,t2,t3,sum1,sum2;
n=500;
cin >> t1;
while(t1--){
cin >> t2;
if(t2==1){ //t2==1时候,f1-f2加f3
cin >> f1>> f2>> f3;
add(c1,f1,f3);add(c1,f2+1,-f3);
add(c2,f1,f3*(f1-1));add(c2,f2+1,-f3*f2);
}else{ //t2==2 的时候 查询f1-f2的和
cin >> f1 >> f2;
sum1=(f1-1)*sigma(c1,f1-1)-sigma(c2,f1-1);
sum2=f2*sigma(c1,f2)-sigma(c2,f2);
cout << sum2-sum1 << endl;
}
}
return 0;
}