DZY loves colors, and he enjoys painting.

On a colorful day, DZY gets a colorful ribbon, which consists of n units (they are numbered from 1 to n from left to right). The color of the i-th unit of the ribbon is i at first. It is colorful enough, but we still consider that the colorfulness of each unit is 0 at first.

DZY loves painting, we know. He takes up a paintbrush with color x and uses it to draw a line on the ribbon. In such a case some contiguous units are painted. Imagine that the color of unit i currently is y. When it is painted by this paintbrush, the color of the unit becomes x, and the colorfulness of the unit increases by |x - y|.

DZY wants to perform m operations, each operation can be one of the following:

  1. Paint all the units with numbers between l and r (both inclusive) with color x. 
  2. Ask the sum of colorfulness of the units between l and r (both inclusive). 



Can you help DZY?

Input

The first line contains two space-separated integers n, m (1 ≤ n, m ≤ 105).

Each of the next m lines begins with a integer type (1 ≤ type ≤ 2), which represents the type of this operation.

If type = 1, there will be 3 more integers l, r, x (1 ≤ l ≤ r ≤ n; 1 ≤ x ≤ 108) in this line, describing an operation 1.

If type = 2, there will be 2 more integers l, r (1 ≤ l ≤ r ≤ n) in this line, describing an operation 2.

Output

For each operation 2, print a line containing the answer — sum of colorfulness.

Examples

Input

3 3
1 1 2 4
1 2 3 5
2 1 3


Output

8


Input

3 4
1 1 3 4
2 1 1
2 2 2
2 3 3


Output

3
2
1


Input

10 6
1 1 5 3
1 2 7 9
1 10 10 11
1 3 8 12
1 1 10 3
2 1 10


Output

129

Note

In the first sample, the color of each unit is initially [1, 2, 3], and the colorfulness is [0, 0, 0].

After the first operation, colors become [4, 4, 3], colorfulness become [3, 2, 0].

After the second operation, colors become [4, 5, 5], colorfulness become [3, 3, 2].

So the answer to the only operation of type 2 is 8.
#include <bits/stdc++.h>
using namespace std;
long long readi() {
  long long input = 0;
  char c = ' ';
  while (c < '-') {
    c = getchar();
  }
  bool negative = false;
  if (c == '-') {
    negative = true;
    c = getchar();
  }
  while (c >= '0') {
    input = 10 * input + (c - '0');
    c = getchar();
  }
  if (negative) {
    input = -input;
  }
  return input;
}
string reads() {
  string input = "";
  char c = ' ';
  while (c <= ' ') {
    c = getchar();
  }
  while (c > ' ') {
    input += c;
    c = getchar();
  }
  return input;
}
void printi(long long output) {
  if (output == 0) {
    putchar('0');
    return;
  }
  if (output < 0) {
    putchar('-');
    output = -output;
  }
  vector<char> vout;
  while (output) {
    vout.push_back((output % 10) + '0');
    output /= 10;
  }
  for (int i = vout.size() - 1; i >= 0; i--) {
    putchar(vout[i]);
  }
  return;
}
void prints(string output) {
  for (int i = 0; i < output.length(); i++) {
    putchar(output[i]);
  }
  return;
}
int N, Q;
set<pair<pair<int, int>, long long> > s;
long long tree[2][100010];
vector<pair<pair<int, int>, long long> > ins;
long long get(int w, int idx) {
  long long sum = 0ll;
  for (int e = idx + 1; e > 0; e -= (e & (-e))) {
    sum += tree[w][e];
  }
  return sum;
}
void modify(int w, int idx, long long val) {
  for (int e = idx + 1; e <= N; e += (e & (-e))) {
    tree[w][e] += val;
  }
  return;
}
long long query(long long idx) { return idx * get(0, idx) - get(1, idx); }
void update(int L, int R, long long val) {
  modify(0, L, val);
  modify(0, R + 1, -val);
  modify(1, L, (val * (L - 1)));
  modify(1, R + 1, -(val * R));
  return;
}
int32_t main() {
  cout << fixed << setprecision(10);
  ios_base::sync_with_stdio(false);
  if (fopen("cf444c.in", "r")) {
    freopen("cf444c.in", "r", stdin);
  }
  cin >> N >> Q;
  for (int i = 0; i < N; i++) {
    s.insert(make_pair(make_pair(i, i), i + 1));
  }
  while (Q--) {
    int qid;
    cin >> qid;
    if (qid == 1) {
      int L, R, val;
      cin >> L >> R >> val;
      L--;
      R--;
      auto it = s.upper_bound(make_pair(make_pair(L, 1000000861), 1000000861));
      it = prev(it);
      int lt = (*it).first.first, rt = (*it).first.second, cur = (*it).second;
      if (lt < L) {
        ins.push_back(make_pair(make_pair(lt, L - 1), cur));
      }
      if (rt > R) {
        ins.push_back(make_pair(make_pair(R + 1, rt), cur));
        update(L, R, abs(cur - val));
        s.erase(it);
        ins.push_back(make_pair(make_pair(L, R), val));
        for (int j = 0; j < ins.size(); j++) {
          s.insert(ins[j]);
        }
        ins.clear();
        continue;
      }
      update(L, rt, abs(cur - val));
      it = s.erase(it);
      for (; it != s.end();) {
        lt = (*it).first.first;
        rt = (*it).first.second;
        cur = (*it).second;
        if (rt >= R) {
          update(lt, R, abs(cur - val));
          if (rt != R) {
            ins.push_back(make_pair(make_pair(R + 1, rt), cur));
          }
          s.erase(it);
          break;
        }
        update(lt, rt, abs(cur - val));
        it = s.erase(it);
      }
      ins.push_back(make_pair(make_pair(L, R), val));
      for (int j = 0; j < ins.size(); j++) {
        s.insert(ins[j]);
      }
      ins.clear();
    }
    if (qid == 2) {
      int L, R;
      cin >> L >> R;
      L--;
      R--;
      cout << query(R) - query(L - 1) << '\n';
    }
  }
  return 0;
}
