#include <bits/stdc++.h>
using namespace std;
template <class T>
bool uin(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
bool uax(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
const int maxn = 210000;
const long long P = 998244353;
set<pair<int, int> > segs[maxn];
long long fastm(long long x) {
  if (x >= P) x -= P;
  return x;
}
struct TNode {
  int L, R;
  int l, r;
  long long sum, a, b;
};
TNode t[2 * maxn];
int tc = 0;
int buildTree(int L, int R) {
  int node = tc++;
  TNode &n = t[node];
  ;
  n = {L, R, -1, -1, 0, 1, 0};
  if (R - L > 1) {
    int M = (L + R) / 2;
    n.l = buildTree(L, M);
    n.r = buildTree(M, R);
  }
  return node;
}
void addval(int node, long long a, long long b) {
  TNode &n = t[node];
  ;
  (n.a *= a) %= P;
  (n.b = a * n.b + b) %= P;
  (n.sum = a * n.sum + b * (n.R - n.L)) %= P;
}
void push(int node) {
  TNode &n = t[node];
  ;
  addval(n.l, n.a, n.b);
  addval(n.r, n.a, n.b);
  n.a = 1;
  n.b = 0;
}
void relax(int node) {
  TNode &n = t[node];
  ;
  n.sum = fastm(t[n.l].sum + t[n.r].sum);
}
void apply(int node, int L, int R, long long a, long long b) {
  TNode &n = t[node];
  ;
  if (max(L, n.L) >= min(R, n.R)) return;
  if (L <= n.L && n.R <= R) {
    addval(node, a, b);
    return;
  }
  push(node);
  apply(n.l, L, R, a, b);
  apply(n.r, L, R, a, b);
  relax(node);
}
long long get_sum(int node, int L, int R) {
  TNode &n = t[node];
  ;
  if (max(L, n.L) >= min(R, n.R)) return 0;
  if (L <= n.L && n.R <= R) return n.sum;
  push(node);
  return fastm(get_sum(n.l, L, R) + get_sum(n.r, L, R));
}
void introseg(int x, int L, int R) {
  int al = L, ar = R;
  while (1) {
    auto it = segs[x].lower_bound(make_pair(L, 1e9));
    if (it == segs[x].end()) break;
    int l = it->second, r = it->first;
    if (l > R) break;
    apply(0, max(l, L), min(r, R), 2, 0);
    if (L < l) apply(0, L, l, 1, 1);
    uin(al, l);
    uax(ar, r);
    segs[x].erase(it);
    L = r;
  }
  if (L < R) apply(0, L, R, 1, 1);
  segs[x].insert(make_pair(ar, al));
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.precision(10);
  cout << fixed;
  int n, q;
  cin >> n >> q;
  buildTree(0, n);
  for (int i = 0; i < (int)(q); ++i) {
    int t;
    cin >> t;
    if (t == 1) {
      int l, r, x;
      cin >> l >> r >> x;
      --l;
      introseg(x, l, r);
    } else {
      int l, r;
      cin >> l >> r;
      --l;
      cout << get_sum(0, l, r) << '\n';
    }
  }
  return 0;
}
