#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 20;
int n, m;
struct sgt {
  long long tree[2 * N], lazy[2 * N];
  void build(int arr[], int cur = 1, int l = 1, int r = n) {
    if (l == r)
      tree[cur] = arr[l];
    else {
      build(arr, cur << 1, l, ((l + r) >> 1));
      build(arr, cur << 1 | 1, ((l + r) >> 1) + 1, r);
      tree[cur] = tree[cur << 1] + tree[cur << 1 | 1];
    }
  }
  void propagate(int& cur, int& l, int& r) {
    if (lazy[cur]) {
      tree[cur << 1] += lazy[cur] * (((l + r) >> 1) - l + 1);
      tree[cur << 1 | 1] += lazy[cur] * (r - ((l + r) >> 1));
      lazy[cur << 1] += lazy[cur];
      lazy[cur << 1 | 1] += lazy[cur];
      lazy[cur] = 0;
    }
  }
  void updtRange(int x, int y, long long val, int cur = 1, int l = 1,
                 int r = n) {
    propagate(cur, l, r);
    if (x > r || y < l) return;
    if (x <= l && r <= y) {
      tree[cur] += val * (r - l + 1);
      lazy[cur] += val;
    } else {
      updtRange(x, y, val, cur << 1, l, ((l + r) >> 1));
      updtRange(x, y, val, cur << 1 | 1, ((l + r) >> 1) + 1, r);
      tree[cur] = tree[cur << 1] + tree[cur << 1 | 1];
    }
  }
  void updtIndx(int indx, int val, int cur = 1, int l = 1, int r = n) {
    propagate(cur, l, r);
    if (indx < l || indx > r) return;
    if (l == r && indx == l)
      tree[cur] += val;
    else {
      updtIndx(indx, val, cur << 1, l, ((l + r) >> 1));
      updtIndx(indx, val, cur << 1 | 1, ((l + r) >> 1) + 1, r);
      tree[cur] = tree[cur << 1] + tree[cur << 1 | 1];
    }
  }
  long long getsum(int x, int y, int cur = 1, int l = 1, int r = n) {
    propagate(cur, l, r);
    if (x > r || y < l) return 0;
    if (x <= l && r <= y) return tree[cur];
    return getsum(x, y, cur << 1, l, ((l + r) >> 1)) +
           getsum(x, y, cur << 1 | 1, ((l + r) >> 1) + 1, r);
  }
};
sgt sg;
set<pair<pair<int, int>, int> > arr;
void makeit(int& st, int& e, int& val) {
  pair<pair<int, int>, int> cur;
  int ns = st;
  while (ns <= e) {
    cur = *(arr.lower_bound({{ns, 0}, 0}));
    arr.erase(cur);
    if (cur.first.second <= ns - 1) {
      arr.insert({{ns - 1, cur.first.second}, cur.second});
    }
    if (cur.first.first > e) {
      arr.insert({{cur.first.first, e + 1}, cur.second});
      sg.updtRange(ns, e, abs(val - cur.second));
      break;
    }
    sg.updtRange(ns, cur.first.first, abs(val - cur.second));
    ns = cur.first.first + 1;
  }
  arr.insert({{e, st}, val});
}
int t, lft, rit, val;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) arr.insert({{i, i}, i});
  while (m--) {
    scanf("%d %d %d", &t, &lft, &rit);
    if (t & 1) {
      scanf("%d", &val);
      makeit(lft, rit, val);
    } else {
      printf("%lld\n", sg.getsum(lft, rit));
    }
  }
  return 0;
}
