ll queryRange(int x, int l, int r, int ql, int qr) { resolve(x, l, r); if(l >= ql && r <= qr) return T[x].sum; ll ret = 0; int m = (l + r) >> 1; if(ql <= m) ret += queryRange(l(x), l, m, ql, qr); // For max() change these two lines if(qr > m) ret += queryRange(r(x), m + 1, r, ql, qr); return ret; }
Int queryRange(int node, int start, int end, int l, int r) { if (end < l || r < start) return 0; if (lazy[node] != 0) { tree[node] += (end-start+1)*lazy[node]; if (start != end) { lazy[2*node] += lazy[node]; lazy[2*node+1] += lazy[node]; } lazy[node] = 0; } if (l <= start && end <= r) return tree[node]; Int mid = (start + end)/2; return queryRange(2*node, start, mid, l, r) + queryRange(2*node+1, mid+1, end, l, r); }
static double timePass(int pass, struct sqlConnection *conn, char *table, int size, struct chromSize *chroms) /* one time pass for the given size */ { struct chromRange *ranges = buildRanges(size, chroms); long startTime = clock1000(); struct chromRange *range; for (range = ranges; range != NULL; range = range->next) queryRange(conn, table, range); double elapsed = ((double)(clock1000()-startTime))/1000.0; printf("pass: %d range size: %d ranges: %d time: %g seconds\n", pass, size, slCount(ranges), elapsed); slFreeList(&ranges); sqlUpdate(conn, NOSQLINJ "flush tables"); return elapsed; }
int main() { // get input Int n, m, k; scanf("%lld%lld%lld", &n, &m, &k); for (Int i=1; i<=n; i++) { scanf("%lld", &num[i]); } build(1, 1, n); Int a, b, c, d; for (Int i=0; i<m+k; i++) { scanf("%lld%lld%lld", &a, &b, &c); if (a==1) { scanf("%lld", &d); updateRange(1,1,n,b,c,d); } else { printf("%lld\n", queryRange(1,1,n,b,c)); } } return 0; }
ll query(int ql, int qr) { return queryRange(0, 0, n - 1, ql, qr); }
void QTree::queryCircle(const double cx, const double cy, const double range, std::vector<Point*>& res) { queryRange(BoundingBox(Point(cx, cy), Point(range, range)), res, 2); return; }