#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
struct ST {
  int l, r, cov;
  long long s, adt;
} t[N << 2];
int n, T, l, r, x, opt;
void update(int k) {
  t[k].s = t[k << 1].s + t[k << 1 | 1].s;
  if (t[k << 1].cov == t[k << 1 | 1].cov)
    t[k].cov = t[k << 1].cov;
  else
    t[k].cov = 0;
}
void build(int k, int l, int r) {
  t[k].l = l;
  t[k].r = r;
  if (l == r) {
    t[k].cov = l;
    return;
  }
  int mid = (l + r) >> 1;
  build(k << 1, l, mid);
  build(k << 1 | 1, mid + 1, r);
  update(k);
}
void cov(int k, int w) {
  int dlt = abs(w - t[k].cov);
  t[k].adt += 1ll * dlt;
  t[k].s += 1ll * dlt * (t[k].r - t[k].l + 1);
  t[k].cov = w;
}
void add(int k, long long w) {
  t[k].adt += w;
  t[k].s += 1ll * w * (t[k].r - t[k].l + 1);
}
void pushdown(int k) {
  if (t[k].cov) {
    t[k << 1].cov = t[k << 1 | 1].cov = t[k].cov;
    if (t[k].adt) {
      add(k << 1, t[k].adt);
      add(k << 1 | 1, t[k].adt);
      t[k].adt = 0;
    }
  }
}
void modify(int k, int L, int R, int w) {
  if (L <= t[k].l && t[k].r <= R && t[k].cov) {
    cov(k, w);
    return;
  }
  pushdown(k);
  int mid = (t[k].l + t[k].r) >> 1;
  if (L <= mid) modify(k << 1, L, R, w);
  if (R > mid) modify(k << 1 | 1, L, R, w);
  update(k);
}
long long query(int k, int L, int R) {
  if (L <= t[k].l && t[k].r <= R) return t[k].s;
  pushdown(k);
  int mid = (t[k].l + t[k].r) >> 1;
  if (R <= mid)
    return query(k << 1, L, R);
  else if (L > mid)
    return query(k << 1 | 1, L, R);
  else
    return query(k << 1, L, R) + query(k << 1 | 1, L, R);
}
int main() {
  scanf("%d%d", &n, &T);
  build(1, 1, n);
  while (T--) {
    scanf("%d%d%d", &opt, &l, &r);
    if (opt == 1) {
      scanf("%d", &x);
      modify(1, l, r, x);
    } else
      printf("%I64d\n", query(1, l, r));
  }
  return 0;
}
