Дерево отрезков: различия между версиями

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 15: Строка 15:
   
   
  int query(int v, int vl, int vr, int l, int r) {
  int query(int v, int vl, int vr, int l, int r) {
     if (l > r)
     if (r < vl || vr < l)
         return 0;
         return 0;
     if (vl == l && r == vr)
     if (l <= vl && vr <= r)
         return t[v];
         return t[v];
     int vm = vl + (vr - vl) / 2;
     int vm = vl + (vr - vl) / 2;
     int ql = query(2 * v + 1, vl, vm, l, min(r, vm));
     int ql = query(2 * v + 1, vl, vm, l, r);
     int qr = query(2 * v + 2, vm + 1, vr, max(l, vm + 1), r);
     int qr = query(2 * v + 2, vm + 1, vr, l, r);
     return ql + qr;
     return ql + qr;
  }
  }
   
   
  void modify(int v, int vl, int vr, int pos, int val) {
  void modify(int v, int vl, int vr, int pos, int val) {
     if (vl == vr) {
     if (pos < vl || vr < pos)
        return;
    if (pos == vl && vl == vr) {
         t[v] += val;
         t[v] += val;
         return;
         return;
     }
     }
     int vm = vl + (vr - vl) / 2;
     int vm = vl + (vr - vl) / 2;
     if (pos <= vm)
     modify(2 * v + 1, vl, vm, pos, val);
        modify(2 * v + 1, vl, vm, pos, val);
     modify(2 * v + 2, vm + 1, vr, pos, val);
     else
        modify(2 * v + 2, vm + 1, vr, pos, val);
     t[v] = t[2 * v + 1] + t[2 * v + 2];
     t[v] = t[2 * v + 1] + t[2 * v + 2];
  }
  }
Строка 63: Строка 63:
   
   
  int query(int v, int vl, int vr, int l, int r) {
  int query(int v, int vl, int vr, int l, int r) {
     if (l > r)
     if (r < vl || vr < l)
         return 0;
         return 0;
     push(v, vl, vr);
     push(v, vl, vr);
     if (vl == l && r == vr)
     if (l <= vl && vr <= vr)
         return t[v];  //return t[v] + add[v] * (vr - vl + 1);
         return t[v];
     int vm = vl + (vr - vl) / 2;
     int vm = vl + (vr - vl) / 2;
     int ql = query(2 * v + 1, vl, vm, l, min(r, vm));
     int ql = query(2 * v + 1, vl, vm, l, r);
     int qr = query(2 * v + 2, vm + 1, vr, max(l, vm + 1), r);
     int qr = query(2 * v + 2, vm + 1, vr, l, r);
     return ql + qr;
     return ql + qr;
  }
  }
   
   
  void modify(int v, int vl, int vr, int l, int r, int val) {
  void modify(int v, int vl, int vr, int l, int r, int val) {
     if (l > r)
     if (r < vl || vr < l)
         return;
         return;
     push(v, vl, vr);
     push(v, vl, vr);
     if (vl == l && r == vr) {
     if (l <= vl && vr <= vr) {
         add[v] += val;
         add[v] += val;
         return;
         return;
     }
     }
     int vm = vl + (vr - vl) / 2;
     int vm = vl + (vr - vl) / 2;
     modify(2 * v + 1, vl, vm, l, min(r, vm), val);
     modify(2 * v + 1, vl, vm, l, r, val);
     modify(2 * v + 2, vm + 1, vr, max(l, vm + 1), r, val);
     modify(2 * v + 2, vm + 1, vr, l, r, val);
     //t[v] = (t[2 * v + 1] + add[2 * v + 1] * (vm - vl + 1)) + (t[2 * v + 2] + add[2 * v + 2] * (vr - vm));
     //t[v] = (t[2 * v + 1] + add[2 * v + 1] * (vm - vl + 1)) + (t[2 * v + 2] + add[2 * v + 2] * (vr - vm));
     int ql = query(2 * v + 1, vl, vm, vl, vm);
     int ql = query(2 * v + 1, vl, vm, vl, vm);

Версия от 18:46, 10 октября 2014

Запрос на отрезке и модификация отдельных элементов

int t[4 * 100010];

void build(int v, int vl, int vr, int a[]) {
    if (vl == vr) {
        t[v] = a[vl];
        return;
    }
    int vm = vl + (vr - vl) / 2;
    build(2 * v + 1, vl, vm, a);
    build(2 * v + 2, vm + 1, vr, a);
    t[v] = t[2 * v + 1] + t[2 * v + 2];
}

int query(int v, int vl, int vr, int l, int r) {
    if (r < vl || vr < l)
        return 0;
    if (l <= vl && vr <= r)
        return t[v];
    int vm = vl + (vr - vl) / 2;
    int ql = query(2 * v + 1, vl, vm, l, r);
    int qr = query(2 * v + 2, vm + 1, vr, l, r);
    return ql + qr;
}

void modify(int v, int vl, int vr, int pos, int val) {
    if (pos < vl || vr < pos)
        return;
    if (pos == vl && vl == vr) {
        t[v] += val;
        return;
    }
    int vm = vl + (vr - vl) / 2;
    modify(2 * v + 1, vl, vm, pos, val);
    modify(2 * v + 2, vm + 1, vr, pos, val);
    t[v] = t[2 * v + 1] + t[2 * v + 2];
}

Запрос на отрезке и модификация на отрезке

int t[4 * 100010], add[4 * 100010];

void push(int v, int vl, int vr) {
    if (vl != vr) {
        add[2 * v + 1] += add[v];
        add[2 * v + 2] += add[v];         
    }
    t[v] += add[v] * (vr - vl + 1);
    add[v] = 0;
}

void build(int v, int vl, int vr, int a[]) {
    if (vl == vr) {
        t[v] = a[vl];
        return;
    }
    int vm = vl + (vr - vl) / 2;
    build(2 * v + 1, vl, vm, a);
    build(2 * v + 2, vm + 1, vr, a);
    t[v] = t[2 * v + 1] + t[2 * v + 2];
}

int query(int v, int vl, int vr, int l, int r) {
    if (r < vl || vr < l)
        return 0;
    push(v, vl, vr);
    if (l <= vl && vr <= vr)
        return t[v];
    int vm = vl + (vr - vl) / 2;
    int ql = query(2 * v + 1, vl, vm, l, r);
    int qr = query(2 * v + 2, vm + 1, vr, l, r);
    return ql + qr;
}

void modify(int v, int vl, int vr, int l, int r, int val) {
    if (r < vl || vr < l)
        return;
    push(v, vl, vr);
    if (l <= vl && vr <= vr) {
        add[v] += val;
        return;
    }
    int vm = vl + (vr - vl) / 2;
    modify(2 * v + 1, vl, vm, l, r, val);
    modify(2 * v + 2, vm + 1, vr, l, r, val);
    //t[v] = (t[2 * v + 1] + add[2 * v + 1] * (vm - vl + 1)) + (t[2 * v + 2] + add[2 * v + 2] * (vr - vm));
    int ql = query(2 * v + 1, vl, vm, vl, vm);
    int qr = query(2 * v + 2, vm + 1, vr, vm + 1, vr);
    t[v] = ql + qr;
}

Ссылки