func_code_string: #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;   }   