#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
const int SQ = 450;
long long C[N], C_baze[SQ], point[N], point_kole_baze[SQ], point_baze[SQ], n, m;
void upd_kamel(int ind, int l, int r, int x) {
  long long st = ind * SQ, en = min(n, st + SQ - 1);
  if (C_baze[ind] == -1) {
    for (int i = st; i <= en; i++) {
      point[i] += abs(C[i] - x);
      point_kole_baze[ind] += abs(C[i] - x);
      C[i] = x;
    }
    C_baze[ind] = x;
  } else {
    point_kole_baze[ind] += abs(C_baze[ind] - x) * (en - st + 1);
    point_baze[ind] += abs(C_baze[ind] - x);
    C_baze[ind] = x;
  }
}
void upd_nesfe(int ind, int l, int r, int x) {
  long long st = ind * SQ, en = min(n, st + SQ - 1);
  if (C_baze[ind] != -1) {
    for (int i = st; i <= en; i++) {
      C[i] = C_baze[ind];
      point[i] += point_baze[ind];
    }
    C_baze[ind] = -1;
    point_baze[ind] = 0;
  }
  for (int i = l; i <= r; i++) {
    point[i] += abs(C[i] - x);
    point_kole_baze[ind] += abs(C[i] - x);
    C[i] = x;
  }
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i <= n; i++) C[i] = i;
  for (int i = 0; i < SQ; i++) C_baze[i] = -1;
  while (m--) {
    int type;
    cin >> type;
    if (type == 1) {
      int l, r, x;
      cin >> l >> r >> x;
      int st = l / SQ, en = r / SQ;
      if (st == en)
        upd_nesfe(st, l, r, x);
      else {
        upd_nesfe(st, l, (st + 1) * SQ - 1, x);
        for (long long i = st + 1; i < en; i++)
          upd_kamel(i, i * SQ, (i + 1) * SQ - 1, x);
        upd_nesfe(en, en * SQ, r, x);
      }
    } else {
      int l, r;
      cin >> l >> r;
      long long ans = 0;
      for (int i = l; i <= r; i++) {
        if ((i % SQ) == 0 && (i + SQ - 1) <= r)
          ans += point_kole_baze[i / SQ], i += (SQ - 1);
        else
          ans += (point[i] + point_baze[i / SQ]);
      }
      cout << ans << '\n';
    }
  }
  return 0;
}
