Advertisement
keverman

Mo's algorithm (qsrd)

May 12th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.85 KB | None | 0 0
  1. struct query
  2. {
  3.     int l, r, idx;
  4. };
  5.  
  6. std::vector<long long> Mo(std::vector<int> &data, std::vector<query> &queries)
  7. {
  8.     static int square;
  9.     square = sqrt(data.size());
  10.     std::vector<long long> answers(queries.size(), 0);
  11.  
  12.     // Sort queries into blocks
  13.     std::sort(queries.begin(), queries.end(), [](query l, query r) -> bool
  14.     {
  15.         if(l.l / square != r.l / square)
  16.             return l.l / square < r.l / square;
  17.  
  18.         return l.r < r.r;
  19.     });
  20.  
  21.     int l = 0, r = 0;
  22.     long long sum = 0;
  23.  
  24.     // Process subsequent blocks of queries
  25.     for(query &q : queries)
  26.     {
  27.         while(l < q.l)     sum -= data[l++];
  28.         while(l > q.l)     sum += data[--l];
  29.         while(r <= q.r)    sum += data[r++];
  30.         while(r > q.r + 1) sum -= data[--r];
  31.  
  32.         answers[q.idx] = sum;
  33.     }
  34.  
  35.     return answers;
  36. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement