long long query_tree(int node, int left, int right, int u, int v) { lazy_update(node); if (u > right || v < left) return -1; if (u <= left && v >= right) return nodes[node]; int mid = (left+right)/2; return max(query(2*node, left, mid, u, v), query(2*node+1, mid+1, right, u, v)); }
void update_tree(int node, int left, int right, int u, int v, long long val) { lazy_update(node); if (u > right || v < left) return; if (u <= left && v >= right) { nodes[node] += val; lazy[2*node] += val; lazy[2*node+1] += val; return; } int mid = (left+right)/2; update_tree(2*node, left, mid, u, v, val); update_tree(2*node+1, mid+1, right, u, v, val); nodes[node] = max(nodes[2*node], nodes[2*node+1]); }
int quorum_query(BackendDB *bd) { int snap = bd->bd_quorum_cache; if (unlikely(snap == 0)) { assert(quorum_list != QR_POISON); lock(); snap = bd->bd_quorum_cache; if (snap == 0) { snap = bd->bd_quorum ? lazy_update(bd->bd_quorum) : 1; assert(snap != 0); bd->bd_quorum_cache = snap; } unlock(); } return snap > 0; }