#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const int maxn = 1e5 + 50;
const long long inf = 0x3f3f3f3f3f3f3f3fLL;
int n, m;
void read(int &res) {
  res = 0;
  char c;
  while (c = getchar(), c < 48)
    ;
  do res = (res << 3) + (res << 1) + (c ^ 48);
  while (c = getchar(), c > 47);
}
inline void out(long long x) {
  if (x > 9) out(x / 10);
  putchar(x % 10 + '0');
}
struct Segment_Tree {
  struct Node {
    int L, R, same;
    long long tag, sum;
    inline int len() { return R - L + 1; }
  } tree[maxn << 2];
  void build(int L, int R, int k = 1) {
    tree[k] = (Node){L, R, -1, 0, 0};
    if (L == R) {
      tree[k].same = L;
      return;
    }
    int mid = L + R >> 1;
    build(L, mid, (k << 1));
    build(mid + 1, R, (k << 1 | 1));
  }
  inline void push_up(int k) {
    tree[k].sum = tree[(k << 1)].sum + tree[(k << 1 | 1)].sum;
    if (tree[(k << 1)].same != tree[(k << 1 | 1)].same)
      tree[k].same = -1;
    else
      tree[k].same = tree[(k << 1)].same;
  }
  void update(int k, long long val, int col) {
    tree[k].tag += val;
    tree[k].sum += 1ll * tree[k].len() * val;
    tree[k].same = col;
  }
  void push_down(int k) {
    if (!tree[k].tag) return;
    update((k << 1), tree[k].tag, tree[k].same);
    update((k << 1 | 1), tree[k].tag, tree[k].same);
    tree[k].tag = 0;
  }
  void modify(int L, int R, int val, int k = 1) {
    if (tree[k].L == L && tree[k].R == R && ~tree[k].same) {
      update(k, abs(val - tree[k].same), val);
      return;
    }
    int mid = tree[k].L + tree[k].R >> 1;
    push_down(k);
    if (R <= mid)
      modify(L, R, val, (k << 1));
    else if (L > mid)
      modify(L, R, val, (k << 1 | 1));
    else {
      modify(L, mid, val, (k << 1));
      modify(mid + 1, R, val, (k << 1 | 1));
    }
    push_up(k);
  }
  long long query(int L, int R, int k = 1) {
    if (tree[k].L == L && tree[k].R == R) return tree[k].sum;
    int mid = tree[k].L + tree[k].R >> 1;
    push_down(k);
    if (R <= mid) return query(L, R, (k << 1));
    if (L > mid) return query(L, R, (k << 1 | 1));
    return query(L, mid, (k << 1)) + query(mid + 1, R, (k << 1 | 1));
  }
} seg;
int main() {
  read(n);
  read(m);
  seg.build(1, n);
  while (m--) {
    int type, l, r, val;
    read(type);
    if (type == 1) {
      read(l);
      read(r);
      read(val);
      seg.modify(l, r, val);
    } else {
      read(l);
      read(r);
      out(seg.query(l, r));
      puts("");
    }
  }
  return 0;
}
