49 lines
772 B
C++
49 lines
772 B
C++
#include "stdafx.h"
|
|
#include "rangeop.h"
|
|
|
|
RangeOp::RangeOp(int size) {
|
|
nn = 1;
|
|
while(nn < size) {
|
|
nn *= 2;
|
|
}
|
|
vals = new int[2*nn];
|
|
memset(vals, 0, 2*nn*sizeof(int));
|
|
}
|
|
|
|
RangeOp::~RangeOp() {
|
|
delete[] vals;
|
|
}
|
|
|
|
int RangeOp::get(int pos) {
|
|
return vals[nn + pos];
|
|
}
|
|
|
|
void RangeOp::set(int pos, int amt) {
|
|
add(pos, amt-get(pos));
|
|
}
|
|
|
|
void RangeOp::add(int pos, int amt) {
|
|
for(int s=nn; s>0; s/=2) {
|
|
vals[s + pos] += amt;
|
|
pos /= 2;
|
|
}
|
|
}
|
|
|
|
int RangeOp::get(int start, int end) {
|
|
int ret = 0;
|
|
int i;
|
|
for(i=1; start+i<=end; i*=2) {
|
|
if(start & i) {
|
|
ret += vals[nn/i + start/i];
|
|
start += i;
|
|
}
|
|
}
|
|
while(i) {
|
|
if(start+i <= end) {
|
|
ret += vals[nn/i + start/i];
|
|
start += i;
|
|
}
|
|
i /= 2;
|
|
}
|
|
return ret;
|
|
} |