Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2016
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const int BLOCK_SIZE = 316; //sqrt(1e5)
  8.  
  9. struct Query {
  10.     int left, right, number;
  11.  
  12.     bool operator < (const Query other) const {
  13.         return right < other.right;
  14.     }
  15. };
  16.  
  17. int cnt[1 << 20];
  18. long long result = 0;
  19. int favourite;
  20.  
  21. void add(int v) {
  22.     result += cnt[v ^ favourite];
  23.     cnt[v]++;
  24. }
  25.  
  26. void del(int v) {
  27.     cnt[v]--;
  28.     result -= cnt[v ^ favourite];
  29. }
  30.  
  31. int main() {
  32.     ios_base::sync_with_stdio(false); cin.tie(0);
  33.  
  34.     int n, m;
  35.     cin >> n >> m >> favourite;
  36.     vector<int> a(n);
  37.     for (int i = 0; i < n; i++) {
  38.         cin >> a[i];
  39.     }
  40.  
  41.     vector<int> pref(n + 1);
  42.     for (int i = 1; i <= n; i++) {
  43.         pref[i] = pref[i - 1] ^ a[i - 1];
  44.     }
  45.  
  46.     vector< vector<Query> > blocks(n / BLOCK_SIZE + 2, vector<Query>());
  47.     for (int i = 0; i < m; i++) {
  48.         int left, right;
  49.         cin >> left >> right;
  50.         left--; right++;
  51.         blocks[left / BLOCK_SIZE].push_back(Query{left, right, i});
  52.     }
  53.     for (auto &i: blocks) {
  54.         sort(i.begin(), i.end());
  55.     }
  56.  
  57.     vector<long long> answer(m);
  58.     for (int i = 0; i < blocks.size(); i++) {
  59.         int left, right;
  60.         left = right = i * BLOCK_SIZE;
  61.         for (auto &q: blocks[i]) {
  62.             while (right < q.right) {
  63.                 add(pref[right]);
  64.                 right++;
  65.             }
  66.             while (left < q.left) {
  67.                 del(pref[left]);
  68.                 left++;
  69.             }
  70.             while (left > q.left) {
  71.                 left--;
  72.                 add(pref[left]);
  73.             }
  74.             answer[q.number] = result;
  75.         }
  76.         for (int j = left; j < right; j++) {
  77.             del(pref[j]);
  78.         }
  79.     }
  80.  
  81.     for (auto i: answer) {
  82.         cout << i << '\n';
  83.     }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement