#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
struct node {
  int lt, rt, color;
  long long sum, len, add;
} tree[maxn << 2];
void pushup(int v) {
  tree[v].sum = tree[v << 1].sum + tree[v << 1 | 1].sum;
  if (tree[v << 1].color == tree[v << 1 | 1].color)
    tree[v].color = tree[v << 1].color;
  else
    tree[v].color = 0;
}
void pushdown(int v) {
  if (tree[v].add) {
    tree[v << 1].add += tree[v].add;
    tree[v << 1 | 1].add += tree[v].add;
    tree[v << 1].sum += tree[v].add * tree[v << 1].len;
    tree[v << 1 | 1].sum += tree[v].add * tree[v << 1 | 1].len;
    tree[v].add = 0;
  }
  if (tree[v].color) {
    tree[v << 1].color = tree[v << 1 | 1].color = tree[v].color;
    tree[v].color = 0;
  }
}
void build(int lt, int rt, int v) {
  tree[v].lt = lt;
  tree[v].rt = rt;
  tree[v].len = rt - lt + 1;
  tree[v].add = 0;
  tree[v].sum = 0;
  if (lt == rt) {
    tree[v].color = lt;
    return;
  }
  int mid = (lt + rt) >> 1;
  build(lt, mid, v << 1);
  build(mid + 1, rt, v << 1 | 1);
  pushup(v);
}
void update(int lt, int rt, int color, int v) {
  if (lt <= tree[v].lt && rt >= tree[v].rt && tree[v].color) {
    tree[v].add += abs(tree[v].color - color);
    tree[v].sum += abs(tree[v].color - color) * tree[v].len;
    tree[v].color = color;
    return;
  }
  pushdown(v);
  if (lt <= tree[v << 1].rt) update(lt, rt, color, v << 1);
  if (rt >= tree[v << 1 | 1].lt) update(lt, rt, color, v << 1 | 1);
  pushup(v);
}
long long query(int lt, int rt, int v) {
  if (lt <= tree[v].lt && rt >= tree[v].rt) return tree[v].sum;
  pushdown(v);
  long long sum = 0;
  if (lt <= tree[v << 1].rt) sum += query(lt, rt, v << 1);
  if (rt >= tree[v << 1 | 1].lt) sum += query(lt, rt, v << 1 | 1);
  pushup(v);
  return sum;
}
int main() {
  int n, m, op, x, y, color;
  scanf("%d%d", &n, &m);
  build(1, n, 1);
  while (m--) {
    scanf("%d%d%d", &op, &x, &y);
    if (op == 1) {
      scanf("%d", &color);
      update(x, y, color, 1);
    } else
      printf("%I64d\n", query(x, y, 1));
  }
  return 0;
}
