#include <bits/stdc++.h>
using namespace std;
int read();
const int N = 1.5e5 + 5;
int n, p, k, m, a[N];
vector<pair<int, int> > seg[N << 2], res;
int eq[N << 2];
void puteq(int k, int l, int r, int v) {
  eq[k] = v;
  seg[k].clear();
  seg[k].push_back(make_pair(v, r - l + 1));
}
bool cmp(const pair<int, int> &a, const pair<int, int> &b) {
  return a.second > b.second;
}
void pushup(vector<pair<int, int> > &a, vector<pair<int, int> > &b) {
  for (int i = (0); i < (b.size()); ++i) a.push_back(b[i]);
  sort(a.begin(), a.end());
  for (int i = (0); i < (int(a.size()) - 1); ++i)
    if (a[i].first == a[i + 1].first)
      a[i + 1].second += a[i].second, a[i].second = 0;
  sort(a.begin(), a.end(), cmp);
  while (a.size() && a.back().second == 0) a.pop_back();
  while (a.size() > k) {
    for (int i = (k + 1); i >= (1); --i)
      a[a.size() - i].second -= a.back().second;
    while (a.size() && a.back().second == 0) a.pop_back();
  }
}
void pushdown(int k, int l, int r, int mid) {
  if (eq[k]) {
    puteq((k << 1), l, mid, eq[k]);
    puteq(((k << 1) | 1), mid + 1, r, eq[k]);
    eq[k] = 0;
  }
}
void change(int k, int l, int r, int x, int y, int v) {
  if (x <= l && r <= y) return puteq(k, l, r, v);
  int mid = l + r >> 1;
  pushdown(k, l, r, mid);
  if (x <= mid) change((k << 1), l, mid, x, y, v);
  if (y > mid) change(((k << 1) | 1), mid + 1, r, x, y, v);
  seg[k] = seg[(k << 1)];
  pushup(seg[k], seg[((k << 1) | 1)]);
}
vector<pair<int, int> > ans;
void query(int k, int l, int r, int x, int y) {
  if (x <= l && r <= y) return pushup(ans, seg[k]);
  int mid = l + r >> 1;
  pushdown(k, l, r, mid);
  if (x <= mid) query((k << 1), l, mid, x, y);
  if (y > mid) query(((k << 1) | 1), mid + 1, r, x, y);
}
void build(int k, int l, int r) {
  if (l == r) {
    seg[k].push_back(make_pair(a[l], 1));
    return;
  }
  int mid = l + r >> 1;
  build((k << 1), l, mid), build(((k << 1) | 1), mid + 1, r);
  seg[k] = seg[(k << 1)], pushup(seg[k], seg[((k << 1) | 1)]);
}
int main() {
  scanf("%d%d%d", &n, &m, &p);
  k = 100 / p;
  for (int i = (1); i <= (n); ++i) scanf("%d", a + i);
  build(1, 1, n);
  while (m--) {
    static int op, l, r, v;
    scanf("%d%d%d", &op, &l, &r);
    if (op == 1)
      scanf("%d", &v), change(1, 1, n, l, r, v);
    else {
      ans.clear();
      query(1, 1, n, l, r);
      printf("%d ", int(ans.size()));
      for (int i = (0); i < (ans.size()); ++i) printf("%d ", ans[i].first);
      puts("");
    }
  }
  return 0;
}
