Advertisement
Bekzhan

Timus 1613

Jun 19th, 2013
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <string>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. vector <vector <int> > tree;
  10.  
  11. vector <int> a;
  12.  
  13. void merge(int l, int r, int v)
  14. {
  15.     int uk1 = 0;
  16.     int uk2 = 0;
  17.  
  18.     int s1 = tree[l].size();
  19.     int s2 = tree[r].size();
  20.  
  21.     for (;;)
  22.         {
  23.             if (uk1 == s1 && uk2 == s2)
  24.                 break;
  25.  
  26.             if (uk1 == s1)
  27.                 {  
  28.                     tree[v].push_back(tree[r][uk2++]);
  29.                     continue;
  30.                 }
  31.  
  32.             if (uk2 == s2)
  33.                 {
  34.                     tree[v].push_back(tree[l][uk1++]);
  35.                     continue;
  36.                 }  
  37.  
  38.             if (tree[l][uk1] < tree[r][uk2])
  39.                 tree[v].push_back(tree[l][uk1++]);
  40.             else
  41.                 tree[v].push_back(tree[r][uk2++]); 
  42.         }
  43. }
  44.  
  45. void build(int v, int l, int r)
  46. {
  47.     if (l > r)
  48.         return;
  49.  
  50.     if (l == r)
  51.         {
  52.             tree[v].push_back(a[l]);
  53.             return;
  54.         }
  55.  
  56.     int m = (l + r) >> 1;
  57.  
  58.     build(2 * v, l, m);
  59.  
  60.     build(2 * v + 1, m + 1, r);
  61.  
  62.     merge(2 * v, 2 * v + 1, v);
  63. }
  64.  
  65. bool get_ans(int v, int cur_l, int cur_r, int l, int r, int cnt)
  66. {
  67.     if (cur_l > cur_r)
  68.         return false;
  69.  
  70.     if (cur_r < l || cur_l > r)
  71.         return false;
  72.  
  73.     if (l == r)
  74.         if (a[l] == cnt)
  75.             return true;
  76.         else
  77.             return false;
  78.  
  79.     if (cur_l == cur_r)
  80.         if (a[cur_l] == cnt)
  81.             return true;
  82.         else
  83.             return false;
  84.  
  85.     if (cur_l >= l && cur_r <= r)
  86.         {
  87.             return binary_search(tree[v].begin(), tree[v].end(), cnt);
  88.         }
  89.  
  90.     int m = (cur_l + cur_r) >> 1;
  91.  
  92.     return (get_ans(2 * v, cur_l, m, l, r, cnt) || (get_ans(2 * v + 1, m + 1, cur_r, l, r, cnt)));
  93. }
  94.  
  95. int main()
  96. {
  97.     #ifndef ONLINE_JUDGE
  98.         freopen("in", "r", stdin);
  99.     #endif
  100.  
  101.     int n;
  102.  
  103.     scanf("%d", &n);
  104.  
  105.     a.resize(n);
  106.  
  107.     tree.resize(4 * n + 1);
  108.  
  109.     for (int i = 0; i < n; i++)
  110.         scanf("%d", &a[i]);
  111.  
  112.     build(1, 0, n - 1);
  113.  
  114.     int m;
  115.  
  116.     scanf("%d", &m);
  117.  
  118.     string ans;
  119.  
  120.     for (int i = 0; i < m; i++)
  121.         {
  122.             int l, r, cnt;
  123.  
  124.             scanf("%d%d%d", &l, &r, &cnt);
  125.  
  126.             l--, r--;
  127.  
  128.             if (get_ans(1, 0, n - 1, l, r, cnt))
  129.                 ans += '1';
  130.             else
  131.                 ans += '0';
  132.  
  133.         }
  134.  
  135.     cout << ans;
  136.  
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement