1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| struct segmentTree { int l, r; int dat; } t[SIZE*4];
void build(int p, int l, int r) { t[p].l = l; t[p].r = r; if (l == r) { t[p].dat = b[l]; return; }
int mid = l + (r-l)/2; build(p*2, l, mid); build(p*2+1, mid+1, r);
t[p].dat = max(t[p*2].dat, t[p*2+1].dat); }
void change(int p, int x, int v) { if (t[p].l == t[p].r) { t[p].dat = v; return; } int mid = t[p].l + (t[p].r - t[p].l)/2; if (x <= mid) change(p*2, x, d); else change(p*2+1, x, d); t[p].dat = max(t[p*2].dat, t[p*2+1].dat); }
int ask(int p, int l, int r) { if (l <= t[p].l && r >= t[p].r) return t[p].dat; int mid = t[p].l + (t[p].r - t[p].l)/2; int val = -(1<<30); if (l <= mid) val = max(val, ask(p*2, l, r)); if (r > mid) val = max(val, ask(p*2+1, l, r)); return val; }
|