#include <bits/stdc++.h>
using namespace std;
template <class T>
void read(T &x) {
  x = 0;
  int w = 0;
  char g = getchar();
  while (!isdigit(g)) {
    w |= (g == '-');
    g = getchar();
  }
  while (isdigit(g)) {
    x = (x << 3) + (x << 1) + (g xor 48);
    g = getchar();
  }
  x = w ? -x : x;
  return;
}
int n, m, p, num[150010], tag[600100];
vector<pair<int, int> > v[600100];
bool cmp(const pair<int, int> &x, const pair<int, int> &y) {
  return x.second > y.second;
}
vector<pair<int, int> > operator+(const vector<pair<int, int> > &x,
                                  const vector<pair<int, int> > &y) {
  vector<pair<int, int> > z = x;
  for (int i = 0; i < y.size(); i++) {
    bool qwq = false;
    for (int j = 0; j < z.size(); j++)
      if (z[j].first == y[i].first) {
        z[j].second += y[i].second;
        qwq = true;
        break;
      }
    if (!qwq) z.push_back(y[i]);
  }
  sort(z.begin(), z.end(), cmp);
  while (z.size() >= p) {
    for (int i = 0; i < z.size(); i++) z[i].second -= z.rbegin()->second;
    z.pop_back();
  }
  return z;
}
void build(int x, int l, int r) {
  if (l == r) {
    v[x].push_back(make_pair(num[l], 1));
    return;
  }
  build(x << 1, l, ((l + r) >> 1));
  build(x << 1 | 1, ((l + r) >> 1) + 1, r);
  v[x] = v[x << 1] + v[x << 1 | 1];
}
void change(int x, int l, int r, int val) {
  tag[x] = val;
  v[x].clear();
  v[x].push_back(make_pair(val, r - l + 1));
}
void pushdown(int x, int l, int r) {
  if (!tag[x]) return;
  change(x << 1, l, ((l + r) >> 1), tag[x]);
  change(x << 1 | 1, ((l + r) >> 1) + 1, r, tag[x]);
  tag[x] = 0;
}
void modify(int x, int l, int r, int L, int R, int val) {
  if (l > R || r < L) return;
  if (L <= l && r <= R) {
    change(x, l, r, val);
    return;
  }
  pushdown(x, l, r);
  modify(x << 1, l, ((l + r) >> 1), L, R, val);
  modify(x << 1 | 1, ((l + r) >> 1) + 1, r, L, R, val);
  v[x] = v[x << 1] + v[x << 1 | 1];
}
vector<pair<int, int> > query(int x, int l, int r, int L, int R) {
  vector<pair<int, int> > qaq;
  if (l > R || r < L) return qaq;
  if (L <= l && r <= R) return v[x];
  pushdown(x, l, r);
  return query(x << 1, l, ((l + r) >> 1), L, R) +
         query(x << 1 | 1, ((l + r) >> 1) + 1, r, L, R);
}
int main() {
  read(n);
  read(m);
  read(p);
  p = (100 / p) + 1;
  for (int i = 1; i <= n; i++) read(num[i]);
  build(1, 1, n);
  for (int i = 1; i <= m; i++) {
    int t1, t2, t3, t4;
    read(t1);
    read(t2);
    read(t3);
    if (t1 == 1) {
      read(t4);
      modify(1, 1, n, t2, t3, t4);
    } else {
      vector<pair<int, int> > z = query(1, 1, n, t2, t3);
      printf("%d ", z.size());
      for (vector<pair<int, int> >::iterator it = z.begin(); it != z.end();
           it++)
        printf("%d ", *it);
      puts("");
    }
  }
  return 0;
}
