Advertisement
Guest User

acm.timus.com 1613 sqrt-decomposition

a guest
Feb 5th, 2014
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. const int block_size = 400;
  9. int a[block_size * block_size];
  10.  
  11. struct Block {
  12.     int sorted_arr[block_size], unsorted_arr[block_size];
  13.     int len;
  14.  
  15.     Block() : len(0) { }
  16.  
  17.     void fill(int* mas, int l, int r) {
  18.         for (int i = l; i <= r; i++) {
  19.             sorted_arr[i % block_size] = mas[i];
  20.             unsorted_arr[i % block_size] = mas[i];
  21.         }  
  22.  
  23.         len = r - l + 1;
  24.         sort(sorted_arr, sorted_arr + len);
  25.     }
  26.  
  27.     bool find(int l, int r, int val) {
  28.         for (int i = l; i <= r; i++)
  29.             if (unsorted_arr[i] == val)
  30.                 return true;
  31.  
  32.         return false;
  33.     }  
  34.    
  35.     bool find(int val) {
  36.         return binary_search(sorted_arr, sorted_arr + len, val);
  37.     }
  38. };
  39.  
  40. struct sqrtDecomp {
  41.     Block a[block_size];
  42.    
  43.     sqrtDecomp() { }
  44.  
  45.     sqrtDecomp(int* arr, int n) {
  46.         for (int i = 0; i <= n / block_size; i++) {
  47.             a[i].fill(arr, i * block_size, min((i + 1) * block_size - 1, n - 1));
  48.         }
  49.     }
  50.  
  51.     bool find(int l, int r, int val) {
  52.         if ((l / block_size) == (r / block_size))
  53.             return a[l / block_size].find(l % block_size, r % block_size, val);
  54.  
  55.         bool flag = false;
  56.  
  57.         flag |= (a[l / block_size].find(l % block_size, block_size - 1, val));
  58.         flag |= (a[r / block_size].find(0, r % block_size, val));
  59.  
  60.         for (int i = (l / block_size) + 1; i < (r / block_size) && !flag; i++)
  61.             flag |= a[i].find(val);
  62.  
  63.         return flag;
  64.     }
  65. };
  66.  
  67. int main() {
  68.     #ifndef ONLINE_JUDGE
  69.         freopen("in", "r", stdin);
  70.     #endif
  71.  
  72.     ios_base :: sync_with_stdio(false);
  73.  
  74.     int n;
  75.     cin >> n;
  76.  
  77.     for (int i = 0; i < n; i++)
  78.         cin >> a[i];
  79.    
  80.     sqrtDecomp dec(a, n);
  81.  
  82.     int m;
  83.     cin >> m;
  84.  
  85.     int l, r, val;
  86.  
  87.     string res;
  88.  
  89.     for (int i = 0; i < m; i++) {
  90.         cin >> l >> r >> val;
  91.  
  92.         res += (dec.find(l - 1, r - 1, val) ? '1' : '0');
  93.     }
  94.  
  95.     cout << res << endl;
  96.  
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement