#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using db = double;
using pii = pair<int, int>;
using vec = vector<pii>;
int read() {
  int x = 0;
  bool f = 0;
  char ch = getchar();
  while (!isdigit(ch)) f |= ch == '-', ch = getchar();
  while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
  return f ? -x : x;
}
const int N = 1.5e5 + 10;
vec val[N << 2];
int K, n, m, a[N];
vec operator+(vec a, vec b) {
  vec res = a;
  for (auto d : b) {
    bool fl = 0;
    for (auto &f : res)
      if (f.first == d.first) {
        fl = 1;
        f.second += d.second;
        break;
      }
    if (!fl) res.push_back(d);
  }
  sort(res.begin(), res.end(),
       [&](pii x, pii y) { return x.second > y.second; });
  while (res.size() > K) {
    int t = res.back().second;
    for (int i = 0, j = res.size() - 1; i <= K; j--, i++) res[j].second -= t;
    while (res.back().second == 0) res.pop_back();
  }
  return res;
}
int tg[N << 2];
void pull(int o, int v, int l, int r) {
  return tg[o] = v, val[o].clear(), val[o].push_back({v, r - l + 1}), void();
}
void pushdown(int o, int l, int r) {
  int mid = l + r >> 1;
  if (tg[o])
    pull(o << 1, tg[o], l, mid), pull(o << 1 | 1, tg[o], mid + 1, r), tg[o] = 0;
}
void build(int o = 1, int l = 1, int r = n) {
  if (l == r) return pull(o, a[l], l, r);
  int mid = l + r >> 1;
  build(o << 1, l, mid);
  build(o << 1 | 1, mid + 1, r);
  val[o] = val[o << 1] + val[o << 1 | 1];
}
void upd(int xl, int xr, int v, int o = 1, int l = 1, int r = n) {
  if (xl == l && xr == r) return pull(o, v, l, r);
  int mid = l + r >> 1;
  pushdown(o, l, r);
  if (xr <= mid)
    upd(xl, xr, v, o << 1, l, mid);
  else if (xl > mid)
    upd(xl, xr, v, o << 1 | 1, mid + 1, r);
  else
    upd(xl, mid, v, o << 1, l, mid),
        upd(mid + 1, xr, v, o << 1 | 1, mid + 1, r);
  val[o] = val[o << 1] + val[o << 1 | 1];
}
vec query(int xl, int xr, int o = 1, int l = 1, int r = n) {
  if (xl == l && xr == r) return val[o];
  int mid = l + r >> 1;
  pushdown(o, l, r);
  if (xr <= mid)
    return query(xl, xr, o << 1, l, mid);
  else if (xl > mid)
    return query(xl, xr, o << 1 | 1, mid + 1, r);
  else
    return query(xl, mid, o << 1, l, mid) +
           query(mid + 1, xr, o << 1 | 1, mid + 1, r);
}
int main() {
  n = read(), m = read();
  K = 100 / read();
  for (int i = 1; i <= n; i++) a[i] = read();
  build();
  for (int i = 1; i <= m; i++) {
    int op = read(), l = read(), r = read();
    if (op == 1)
      upd(l, r, read());
    else {
      vec ans = query(l, r);
      printf("%d", ans.size());
      for (auto y : ans) printf(" %d", y.first);
      puts("");
    }
  }
  return 0;
}
