Mr_Olympia

частичное каскадирование (количество больших к на отрезке)

Jul 18th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1.  
  2. class SegmentTreeFC {
  3.  
  4.     int sz;
  5.     vector< vector<int> > t, tl, tr;
  6.  
  7.     void build(int v, int vl, int vr, const vector<int> &a) {
  8.         if (vl == vr) {
  9.             t[v].push_back(a[vl]);
  10.             return;
  11.         }
  12.         int vm = vl + (vr - vl) / 2;
  13.         build(2 * v + 1, vl, vm, a);
  14.         build(2 * v + 2, vm + 1, vr, a);
  15.  
  16.         int l = 2 * v + 1, r = 2 * v + 2;
  17.         int ls = t[l].size(), rs = t[r].size(), ts = ls + rs;
  18.         t[v].resize(ts);
  19.         tl[v].resize(ts + 1);
  20.         tr[v].resize(ts + 1);
  21.         tl[v][ts] = ls;
  22.         tr[v][ts] = rs;
  23.         for (int i = ts - 1, li = ls - 1, ri = rs - 1; i >= 0; i--) {
  24.             if (li < 0)
  25.                 t[v][i] = t[r][ri--];
  26.             else if (ri < 0)
  27.                 t[v][i] = t[l][li--];
  28.             else if (t[l][li] > t[r][ri])
  29.                 t[v][i] = t[l][li--];
  30.             else
  31.                 t[v][i] = t[r][ri--];
  32.             tl[v][i] = (li >= 0 && t[l][li] >= t[v][i] ? li : li + 1);
  33.             tr[v][i] = (ri >= 0 && t[r][ri] >= t[v][i] ? ri : ri + 1);
  34.         }
  35.     }
  36.  
  37.     int query(int v, int vl, int vr, int l, int r, int k, int ub) const {
  38.         if (ub == -1)
  39.             ub = upper_bound(t[v].begin(), t[v].end(), k) - t[v].begin();
  40.         if (r < vl || vr < l)
  41.             return 0;
  42.         if (l <= vl && vr <= r)
  43.             return vr - vl + 1 - ub;
  44.         int vm = vl + (vr - vl) / 2;
  45.         int ql = query(2 * v + 1, vl, vm, l, r, k, tl[v][ub]);
  46.         int qr = query(2 * v + 2, vm + 1, vr, l, r, k, tr[v][ub]);
  47.         return ql + qr;
  48.     }
  49.  
  50. public:
  51.  
  52.     SegmentTreeFC(const vector<int> &a) {
  53.         sz = a.size();
  54.         t.resize(4 * sz);
  55.         tl.resize(4 * sz);
  56.         tr.resize(4 * sz);
  57.         build(0, 0, sz - 1, a);
  58.     }
  59.  
  60.     int query(int l, int r, int k) const {
  61.         return query(0, 0, sz - 1, l, r, k, -1);
  62.     }
  63.  
  64. };
  65.  
  66.  
  67. int main() {
  68.     int aSize;
  69.     scanf("%d", &aSize);
  70.  
  71.     vector<int> a(aSize);
  72.     for (int i = 0; i < aSize; i++)
  73.         scanf("%d", &a[i]);
  74.  
  75.     SegmentTreeFC st(a);
  76.  
  77.     int queriesCount;
  78.     scanf("%d", &queriesCount);
  79.  
  80.     for (int i = 0; i < queriesCount; i++) {
  81.         int l, r, k;
  82.         scanf("%d%d%d", &l, &r, &k);
  83.         printf("%d\n", st.query(l - 1, r - 1, k));
  84.     }
  85. }
Add Comment
Please, Sign In to add comment