#include <bits/stdc++.h>   using namespace std;   template <class T>   ostream& operator<<(ostream& out, const tuple<T>& a) {     out <<  [  << get<0>(a) <<  ] ;     return out;   }   template <class T, class U>   ostream& operator<<(ostream& out, const tuple<T, U>& a) {     out <<  [  << get<0>(a) <<     << get<1>(a) <<  ] ;     return out;   }   template <class T, class U, class V>   ostream& operator<<(ostream& out, const tuple<T, U, V>& a) {     out <<  [  << get<0>(a) <<     << get<1>(a) <<     << get<2>(a) <<  ] ;     return out;   }   template <class T, class U, class V, class W>   ostream& operator<<(ostream& out, const tuple<T, U, V, W>& a) {     out <<  [  << get<0>(a) <<     << get<1>(a) <<     << get<2>(a) <<             << get<3>(a) <<  ] ;     return out;   }   template <class T, class U>   ostream& operator<<(ostream& out, const pair<T, U>& a) {     out <<  [  << a.first <<     << a.second <<  ] ;     return out;   }   template <class T>   ostream& operator<<(ostream& out, const vector<T>& a) {     out <<  [  ;     for (auto& it : a) out << it <<    ;     out <<  ] ;     return out;   }   template <class T>   ostream& operator<<(ostream& out, const set<T>& a) {     out <<  [  ;     for (auto& it : a) out << it <<    ;     out <<  ] ;     return out;   }   template <class T>   ostream& operator<<(ostream& out, const multiset<T>& a) {     out <<  [  ;     for (auto& it : a) out << it <<    ;     out <<  ] ;     return out;   }   template <class T, class U>   ostream& operator<<(ostream& out, const map<T, U>& a) {     for (auto& it : a) out << it.first <<   ->   << it.second <<   |  ;     return out;   }   template <class T, class U>   ostream& operator<<(ostream& out, const multimap<T, U>& a) {     for (auto& it : a) out << it.first <<   ->   << it.second <<   |  ;     return out;   }   template <typename Arg1>   void __f(const char* name, Arg1&& arg1) {     cerr << name <<   :   << arg1 << std::endl;   }   template <typename Arg1, typename... Args>   void __f(const char* names, Arg1&& arg1, Args&&... args) {     const char* comma = strchr(names + 1,  , );     cerr.write(names, comma - names) <<   :   << arg1 <<   |  ;     __f(comma + 1, args...);   }   void r(){};   template <typename T, typename... Args>   void r(T& a, Args&... args) {     cin >> a;     r(args...);   }   void p() { cout <<   n ; };   template <typename T, typename... Args>   void p(T& a, Args&... args) {     cout << a <<    ;     p(args...);   }   template <class T>   T gcd(T a, T b) {     return a ? gcd(b % a, a) : b;   }   template <class T>   T lcm(T a, T b) {     return ((a * b) / gcd(b % a, a));   }   template <class T1, class T2>   T1 binpow(T1 number, T2 power) {     T1 result = number;     while (power) {       if (power & 1) result = result * number;       number = number * number;       power /= 2;     }     return result;   }   long long n;   class Segtree {    public:     long long *tree, *lazy, *array, *color, *is_single;     Segtree(long long* arr, long long sz) {       array = new long long[sz];       lazy = new long long[4 * sz];       tree = new long long[4 * sz];       color = new long long[4 * sz];       is_single = new long long[4 * sz];       n = sz;       for (auto i = (0) - ((0) > (n)); i != (n) - ((0) > (n));            i += 1 - 2 * ((0) > (n)))         array[i] = arr[i];       for (auto i = (0) - ((0) > (4 * sz)); i != (4 * sz) - ((0) > (4 * sz));            i += 1 - 2 * ((0) > (4 * sz)))         tree[i] = 0;       for (auto i = (0) - ((0) > (4 * sz)); i != (4 * sz) - ((0) > (4 * sz));            i += 1 - 2 * ((0) > (4 * sz)))         lazy[i] = 0;       for (auto i = (0) - ((0) > (4 * sz)); i != (4 * sz) - ((0) > (4 * sz));            i += 1 - 2 * ((0) > (4 * sz)))         color[i] = 0;       for (auto i = (0) - ((0) > (4 * sz)); i != (4 * sz) - ((0) > (4 * sz));            i += 1 - 2 * ((0) > (4 * sz)))         is_single[i] = 0;       build();     }     void build(long long id = 1, long long l = 0, long long r = n) {       if (r - l < 2) {         tree[id] = 0;         color[id] = array[l];         is_single[id] = 1;         return;       }       auto mid = (l + r) / 2;       build(2 * id, l, mid);       build(2 * id + 1, mid, r);       tree[id] = tree[2 * id] + tree[2 * id + 1];       if (color[2 * id] == color[2 * id + 1] and color[2 * id] != 0)         is_single[id] = 1, color[id] = color[2 * id];       else         is_single[id] = 0, color[id] = 0;     }     void upd(long long id, long long l, long long r, long long x,              long long coloring) {       lazy[id] += x;       tree[id] += (r - l) * x;       if (coloring != 0) color[id] = coloring;     }     void shift(long long id, long long l, long long r) {       long long mid = (l + r) / 2;       upd(id * 2, l, mid, lazy[id], color[id]);       upd(id * 2 + 1, mid, r, lazy[id], color[id]);       lazy[id] = 0;     }     long long sum(long long x, long long y, long long id = 1, long long l = 0,                   long long r = n) {       if (l >= y or r <= x) return 0;       if (l >= x and r <= y) return tree[id];       shift(id, l, r);       auto mid = (l + r) / 2;       return sum(x, y, 2 * id, l, mid) + sum(x, y, 2 * id + 1, mid, r);     }     void range_update(long long x, long long y, long long coloring,                       long long id = 1, long long l = 0, long long r = n) {       auto mid = (l + r) / 2;       if (l >= y or r <= x) return;       if (x <= l and r <= y) {         if (is_single[id]) {           upd(id, l, r, abs(color[id] - coloring), coloring);         } else {           shift(id, l, r);           range_update(x, y, coloring, 2 * id, l, mid);           range_update(x, y, coloring, 2 * id + 1, mid, r);           tree[id] = tree[2 * id] + tree[2 * id + 1];         }         is_single[id] = 1;         color[id] = coloring;         return;       }       shift(id, l, r);       range_update(x, y, coloring, 2 * id, l, mid);       range_update(x, y, coloring, 2 * id + 1, mid, r);       tree[id] = tree[2 * id] + tree[2 * id + 1];       if (color[2 * id] == color[2 * id + 1] and color[2 * id] != 0)         is_single[id] = 1, color[id] = color[2 * id];       else         is_single[id] = 0, color[id] = 0;     }   };   long long m, arr[112345], types, lef, ri, x;   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     r(n, m);     for (auto i = (0) - ((0) > (n)); i != (n) - ((0) > (n));          i += 1 - 2 * ((0) > (n)))       arr[i] = i + 1;     Segtree tree(arr, n);     for (auto i = (0) - ((0) > (m)); i != (m) - ((0) > (m));          i += 1 - 2 * ((0) > (m))) {       r(types);       if (types == 1) {         r(lef, ri, x);         tree.range_update(lef - 1, ri, x);       } else {         r(lef, ri);         auto sum = tree.sum(lef - 1, ri);         p(sum);       }     }   }