#include <bits/stdc++.h>
using namespace std;
int N;
vector<pair<int, int> > Merge(vector<pair<int, int> > a,
                              vector<pair<int, int> > b) {
  if (a.size() < b.size()) swap(a, b);
  for (int i = 0; i < b.size(); ++i) {
    bool flag = 0;
    for (int j = 0; j < a.size(); ++j) {
      if (a[j].second == b[i].second) {
        a[j].first += b[i].first;
        flag = 1;
        break;
      }
    }
    if (!flag) {
      if (a.size() < N) {
        a.push_back(b[i]);
        sort(a.begin(), a.end());
        continue;
      }
      if (a[0].first < b[i].first) swap(a[0], b[i]);
      for (int j = 0; j < a.size(); ++j) a[j].first -= b[i].first;
    }
    sort(a.begin(), a.end());
  }
  sort(a.begin(), a.end());
  return a;
}
vector<pair<int, int> > mx[150005 << 2];
int tag[150005 << 2], n, m, p, a[150005];
void build(int x, int l, int r) {
  if (l == r) {
    mx[x].push_back(make_pair(1, a[l]));
    return;
  }
  build((x << 1), l, ((l + r) >> 1));
  build((x << 1 | 1), ((l + r) >> 1) + 1, r);
  mx[x] = Merge(mx[(x << 1)], mx[(x << 1 | 1)]);
}
void ptag(int x, int l, int r, int v) {
  tag[x] = v;
  mx[x].clear();
  mx[x].push_back(make_pair(r - l + 1, v));
}
void pd(int x, int l, int r) {
  if (tag[x]) {
    ptag((x << 1), l, ((l + r) >> 1), tag[x]);
    ptag((x << 1 | 1), ((l + r) >> 1) + 1, r, tag[x]);
    tag[x] = 0;
  }
}
void change(int x, int l, int r, int b, int e, int v) {
  if (b <= l && r <= e) {
    ptag(x, l, r, v);
    return;
  }
  if (l > e || r < b) return;
  pd(x, l, r);
  if (b <= ((l + r) >> 1)) change((x << 1), l, ((l + r) >> 1), b, e, v);
  if (e > ((l + r) >> 1)) change((x << 1 | 1), ((l + r) >> 1) + 1, r, b, e, v);
  mx[x] = Merge(mx[(x << 1)], mx[(x << 1 | 1)]);
}
vector<pair<int, int> > emp;
vector<pair<int, int> > ask(int x, int l, int r, int b, int e) {
  if (l > e || r < b) return emp;
  if (b <= l && r <= e) return mx[x];
  pd(x, l, r);
  if (e <= ((l + r) >> 1)) return ask((x << 1), l, ((l + r) >> 1), b, e);
  if (b > ((l + r) >> 1)) return ask((x << 1 | 1), ((l + r) >> 1) + 1, r, b, e);
  return Merge(ask((x << 1), l, ((l + r) >> 1), b, e),
               ask((x << 1 | 1), ((l + r) >> 1) + 1, r, b, e));
}
int main() {
  scanf("%d%d%d", &n, &m, &p);
  N = 100 / p;
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  build(1, 1, n);
  for (int i = 1; i <= m; ++i) {
    int op, l, r;
    scanf("%d%d%d", &op, &l, &r);
    if (op == 1) {
      int id;
      scanf("%d", &id);
      change(1, 1, n, l, r, id);
    } else {
      vector<pair<int, int> > tmp = ask(1, 1, n, l, r);
      int nn = tmp.size();
      printf("%d ", nn);
      for (int i = 0; i < tmp.size(); ++i) printf("%d ", tmp[i].second);
      puts("");
    }
  }
  return 0;
}
