线段树
线段树模板:
struct Segement {
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 = a[l];
return ;
}
int mid = (l + r) / 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);
}
build(1, 1, n);
单点修改:
// 单点修改 C x v, 把A[x]的值改为v
void change(int p, int x, int v)
{
if (t[p].l == t[p].r)
{
t[p].dat = v;
return ;
}
if (x <= mid) change(p * 2, x, v);
else change(p * 2 + 1, x, v);
t[p].dat = max(t[p * 2].dat, t[p * 2 + 1].dat);
}
change(1, x, v);
线段树的区间查询:
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) / 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;
}
cout << ask(1, 1, n) << endl;