#include <bits/stdc++.h>
#pragma GCC optimize("O2")
using namespace std;
const int N = 1e5 + 10;
const long long mod = 1e9 + 7;
const long long mod2 = 998244353;
const int inf = 1e9;
const int LOG = 22;
long long pw(long long a, long long b, long long M) {
  return (!b ? 1
             : (b & 1 ? (a * pw(a * a % M, b / 2, M)) % M
                      : pw(a * a % M, b / 2, M)));
}
struct node {
  int mx1, mx2, cnt, lz;
  long long sum;
  node(int m1 = -inf, int m2 = -inf, int c = 0, int l = inf, long long s = 0) {
    mx1 = m1, mx2 = m2, cnt = c, lz = l, sum = s;
  }
  friend node operator|(node L, node R) {
    if (L.mx1 < R.mx1) swap(L, R);
    if (L.mx1 == R.mx1)
      L.cnt += R.cnt;
    else
      L.mx2 = max(L.mx2, R.mx1);
    L.mx2 = max(L.mx2, R.mx2);
    L.sum += R.sum;
    L.lz = inf;
    return L;
  }
};
struct segment_beats {
  node seg[N << 2];
  void shift(int v, int lz) {
    seg[v].lz = min(seg[v].lz, lz);
    seg[v].sum -= 1ll * seg[v].cnt * max(0, seg[v].mx1 - lz);
    seg[v].mx1 = min(seg[v].mx1, lz);
  }
  void second(int v, int tl, int tr) {
    if (tl == tr) return;
    shift(v << 1, seg[v].lz);
    shift(v << 1 | 1, seg[v].lz);
  }
  void change(int p, int x, int v = 1, int tl = 1, int tr = N - 1) {
    second(v, tl, tr);
    if (p > tr || p < tl) return;
    if (tl == tr) {
      seg[v] = node(x, -inf, 1, inf, x);
      return;
    }
    int mid = (tl + tr) >> 1;
    change(p, x, v << 1, tl, mid), change(p, x, v << 1 | 1, mid + 1, tr);
    seg[v] = seg[v << 1] | seg[v << 1 | 1];
  }
  void upd(int l, int r, int x, int v = 1, int tl = 1, int tr = N - 1) {
    second(v, tl, tr);
    if (l > tr || r < tl || l > r || seg[v].mx1 <= x) return;
    if (l <= tl && tr <= r && seg[v].mx2 < x) {
      shift(v, x);
      return;
    }
    int mid = (tl + tr) >> 1;
    upd(l, r, x, v << 1, tl, mid), upd(l, r, x, v << 1 | 1, mid + 1, tr);
    seg[v] = seg[v << 1] | seg[v << 1 | 1];
  }
  long long get(int l, int r, int v = 1, int tl = 1, int tr = N - 1) {
    second(v, tl, tr);
    if (l > tr || r < tl || l > r) return 0ll;
    if (l <= tl && tr <= r) {
      return seg[v].sum;
    }
    int mid = (tl + tr) >> 1;
    return get(l, r, v << 1, tl, mid) + get(l, r, v << 1 | 1, mid + 1, tr);
  }
} seg1, seg2;
struct segment {
  int lz[N << 2];
  segment() {
    for (int i = 0; i < N << 2; i++) lz[i] = inf;
  }
  void upd(int l, int r, int x, int v = 1, int tl = 1, int tr = N - 1) {
    if (l > tr || r < tl || l > r) return;
    if (l <= tl && tr <= r) {
      lz[v] = min(lz[v], x);
      return;
    }
    int mid = (tl + tr) >> 1;
    upd(l, r, x, v << 1, tl, mid), upd(l, r, x, v << 1 | 1, mid + 1, tr);
  }
  int ask(int p, int v = 1, int tl = 1, int tr = N - 1) {
    if (tl == tr) {
      return lz[v];
    }
    int mid = (tl + tr) >> 1;
    if (p <= mid) {
      return min(lz[v], ask(p, v << 1, tl, mid));
    }
    return min(lz[v], ask(p, v << 1 | 1, mid + 1, tr));
  }
} Seg1, Seg2;
set<int> st1, st2;
int main() {
  for (int i = 1; i < N; i++) st1.insert(i), st2.insert(i);
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int tp, l, r;
    scanf("%d%d%d", &tp, &l, &r);
    r--;
    if (tp == 1) {
      int x;
      scanf("%d", &x);
      if (x < 0) {
        x = abs(x);
        seg1.upd(l, r, x);
        Seg1.upd(l, r, x);
        while (1) {
          auto it = st1.lower_bound(l);
          if (it == st1.end() || *it > r) break;
          int cu = *it;
          st1.erase(cu);
          if (st2.count(cu) == 0) {
            seg1.change(cu, x);
            seg2.change(cu, Seg2.ask(cu));
          }
        }
      } else {
        seg2.upd(l, r, x);
        Seg2.upd(l, r, x);
        while (1) {
          auto it = st2.lower_bound(l);
          if (it == st2.end() || *it > r) break;
          int cu = *it;
          st2.erase(cu);
          if (st1.count(cu) == 0) {
            seg2.change(cu, x);
            seg1.change(cu, Seg1.ask(cu));
          }
        }
      }
    } else {
      printf("%lld\n", seg1.get(l, r) + seg2.get(l, r));
    }
  }
  return 0;
}
