Advertisement
dipBRUR

Interval 0/1 Bit

Aug 27th, 2017
466
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.81 KB | None | 0 0
  1. //    ||  ||   //\\    || \\   |||||||
  2. //    ||  ||  //  \\   ||  \\  ||
  3. //    |||||| ||    ||  || ||   |||||     KRISNA
  4. //    ||  || ||    ||  || \\   ||
  5. //    ||  || ||    ||  ||  \\  |||||||
  6.  
  7. /**
  8.  * Author           : Dipu Kumar Mohanto (Dip)
  9.  *                    CSE, BRUR.
  10.  *                    Batch - 6
  11.  *
  12.  * Problem          : Interval 0/1 Bit
  13.  * Algorithm        :
  14.  * Complexity       :
  15.  * Category         :
  16.  *
  17.  * Difficulty       :
  18.  * Source           :
  19.  *
  20.  * Verdict          :
  21.  *
  22.  * Code url         :
  23.  *
  24.  * Date             :
  25.  * E-mail           : dipukumarmohanto1@gmail.com
  26.  **/
  27.  
  28. #include <algorithm>
  29. #include <iostream>
  30. #include <iterator>
  31. #include <numeric>
  32. #include <iomanip>
  33. #include <sstream>
  34. #include <fstream>
  35. #include <cassert>
  36. #include <climits>
  37. #include <cstdlib>
  38. #include <cstring>
  39. #include <string>
  40. #include <cstdio>
  41. #include <vector>
  42. #include <cmath>
  43. #include <queue>
  44. #include <deque>
  45. #include <stack>
  46. #include <list>
  47. #include <map>
  48. #include <set>
  49. #include <memory.h>
  50. #include <functional>
  51. #include <numeric>
  52.  
  53. using namespace:: std;
  54.  
  55.  
  56. #define READ                                 freopen("in.txt", "r", stdin)
  57. #define WRITE                                freopen("out.txt", "w", stdout)
  58.  
  59. #define FAST                                 ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)
  60.  
  61.  
  62.  
  63. #define All(v)                              v.begin(), v.end()
  64. #define SZ(a)                               a.size()
  65. #define Sort(v)                             sort(All(v))
  66. #define ED(v)                               Sort(v), v.erase(unique(All(v), v.end())
  67. #define Common(a, b)                        Sort(v), Sort(b), a.erase(set_intesection(All(a), All(b), a.begin(), a.end()))
  68. #define UnCommon(a, b)                      Sort(v), Sort(b), a.erase(set_symmetric_difference(All(a), All(b), All(a)))
  69.  
  70.  
  71. #define max3(a, b, c)                       max(a, max(b, c))
  72. #define min3(a, b, c)                       min(a, min(b, c))
  73. #define maxAll(v)                          *max_element(All(v))
  74. #define minAll(v)                          *min_element(All(v))
  75.  
  76.  
  77. #define AllUpper(a)                         transform(All(a), a.begin(), :: toupper)
  78. #define AllLower(a)                         transform(All(a), a.begin(), :: tolower)
  79. #define Rev(a)                              reverse(All(a))
  80.  
  81.  
  82. #define memo(a, b)                          memset(a, b, sizeof(a))
  83.  
  84. #define ff                                  first
  85. #define ss                                  second
  86. #define pb                                  push_back
  87. #define mk                                  make_pair
  88.  
  89. #define inf2                               1 << 28
  90.  
  91. template <typename T>string toString (T Number)    { stringstream st; st << Number; return st.str(); }
  92. int toInteger (string s)                           { int p; istringstream st(s); st>>p ; return p;}
  93.  
  94.  
  95.  
  96. //int dr[] = {1, -1, 0, 0};               // 4 Direction
  97. //int dc[] = {0, 0, 1, -1};
  98.  
  99. //int dr[] = {0, 0, 1, -1, 1, 1, -1, -1};  // 8 Direction
  100. //int dc[] = {1, -1, 0, 0, 1, -1, 1, -1};
  101.  
  102. //int dr[] = {-1, 1, -2, -2, -1, 1, 2, 2}; // knight Moves
  103. //int dc[] = {-2, -2, -1, 1, 2, 2, 1, -1};
  104.  
  105.  
  106. #define Exp                                exp(1.0)
  107. #define PIE                                2*acos(0.0)
  108. #define Sin(a)                             sin(((a)*PI)/180.0)
  109. #define mod                                1000000007
  110. #define EPS                                1e-9
  111.  
  112. #define sqr(a)                             ((a)*(a))
  113. #define gcd(a,b)                           __gcd(a,b)
  114. #define lcm(a,b)                           (a*(b/gcd(a,b)))
  115.  
  116.  
  117. typedef long long          ll;
  118.  
  119. const int mx = 100000 + 5;
  120.  
  121.  
  122.  
  123. int num_0[mx];
  124. int num_1[mx];
  125.  
  126.  
  127. pair <int, int> f(int n)
  128. {
  129.     int one = 0;
  130.     int zero = 0;
  131.  
  132.     while (n)
  133.     {
  134.         int rem = n%2;
  135.  
  136.         if (rem)
  137.             one++;
  138.  
  139.         else
  140.             zero++;
  141.  
  142.         n /= 2;
  143.     }
  144.     return make_pair(zero, one);
  145. }
  146.  
  147. void calc()
  148. {
  149.     for (int i=0; i<mx-4; i++)
  150.     {
  151.         pair <int, int> n = f(i);
  152.  
  153.         num_0[i] = n.ff;
  154.         num_1[i] = n.ss;
  155.     }
  156. }
  157.  
  158. #define PII               pair <int, int>
  159.  
  160.  
  161. struct treeNode {
  162.     int One, Zero;
  163.  
  164.     void assignLeaf(int num)
  165.     {
  166.  
  167.         if (!num_0[num])
  168.             Zero = 0;
  169.  
  170.         else
  171.             Zero = num;
  172.  
  173.         if (!num_1[num])
  174.             One = num;
  175.  
  176.         else
  177.             One = num;
  178.     }
  179.  
  180.  
  181.     void Marge(treeNode& left, treeNode& right) {
  182.         int one_left = left.One;
  183.         int zero_left = left.Zero;
  184.  
  185.         int one_right = right.One;
  186.         int zero_right = right.Zero;
  187.  
  188.  
  189.         if (num_0[zero_left] > num_0[zero_right]) {
  190.             Zero = zero_left;
  191.         }
  192.  
  193.         else if (num_0[zero_left] < num_0[zero_right]) {
  194.             Zero = zero_right;
  195.         }
  196.  
  197.         else if (num_0[zero_left] == num_0[zero_right]) {
  198.             Zero = max(zero_left, zero_right);
  199.         }
  200.  
  201.         if (num_1[one_left] > num_1[one_right]) {
  202.             One = one_left;
  203.         }
  204.  
  205.         else if (num_1[one_left] < num_1[one_right]) {
  206.             One = one_right;
  207.         }
  208.  
  209.         else if (num_1[one_left] == num_1[one_right]) {
  210.             One = min(one_left, one_right);
  211.         }
  212.     }
  213.  
  214.  
  215.  
  216.     treeNode Query(treeNode& left, treeNode& right) {
  217.         int one_left = left.One;
  218.         int zero_left = left.Zero;
  219.  
  220.         int one_right = right.One;
  221.         int zero_right = right.Zero;
  222.  
  223.         if (zero_left == -1 && one_left==-1)
  224.         {
  225.             treeNode t;
  226.             t.Zero = zero_right;
  227.             t.One =  one_right;
  228.         }
  229.  
  230.         if (zero_right == -1 && one_right==-1)
  231.         {
  232.             treeNode t;
  233.             t.Zero = zero_left;
  234.             t.One =  one_left;
  235.         }
  236.  
  237.  
  238.         if (num_0[zero_left] > num_0[zero_right]) {
  239.             Zero = zero_left;
  240.         }
  241.  
  242.         else if (num_0[zero_left] < num_0[zero_right]) {
  243.             Zero = zero_right;
  244.         }
  245.  
  246.         else if (num_0[zero_left] == num_0[zero_right]) {
  247.             Zero = max(zero_left, zero_right);
  248.         }
  249.  
  250.         if (num_1[one_left] > num_1[one_right]) {
  251.             One = one_left;
  252.         }
  253.  
  254.         else if (num_1[one_left] < num_1[one_right]) {
  255.             One = one_right;
  256.         }
  257.  
  258.         else if (num_1[one_left] == num_1[one_right]) {
  259.             One = min(one_left, one_right);
  260.         }
  261.  
  262.         treeNode t;
  263.         t.One = One;
  264.         t.Zero = Zero;
  265.  
  266.         return t;
  267.     }
  268.  
  269.  
  270.     void updat(int num)
  271.     {
  272.         Zero = num;
  273.         One = num;
  274.     }
  275.  
  276.  
  277.  
  278.  
  279. } tree[mx << 2];
  280.  
  281. treeNode Return() {
  282.         treeNode t;
  283.  
  284.         t.One = -1;
  285.         t.Zero = -1;
  286.  
  287.         return t;
  288. }
  289.  
  290. int arr[mx];
  291.  
  292.  
  293.  
  294. void build_tree(int node, int a, int b)
  295. {
  296.     if (a>b)
  297.         return;
  298.  
  299.     if (a==b)
  300.     {
  301.         tree[node].assignLeaf(arr[a]);
  302.  
  303.         return;
  304.     }
  305.     int left = node<<1;
  306.     int right = left|1;
  307.     int mid = (a+b)>>1;
  308.  
  309.     build_tree(left, a, mid);
  310.     build_tree(right, mid+1, b);
  311.  
  312.     tree[node].Marge(tree[left], tree[right]);
  313. }
  314.  
  315.  
  316.  
  317. treeNode query(int node, int a, int b, int i, int j)
  318. {
  319.     if (a>b || i>b || j<a)
  320.         return Return();
  321.  
  322.     if (a>=i && b<=j)
  323.         return tree[node];
  324.  
  325.     int left = node<<1;
  326.     int right = node<<1|1;
  327.     int mid = (a+b)>>1;
  328.  
  329.  
  330.     treeNode left_part = query(left, a, mid, i, j);
  331.     treeNode right_part = query(right, mid+1, b, i, j);
  332.  
  333.     treeNode res;
  334.  
  335.     res.Query(left_part, right_part);
  336.  
  337.     return res;
  338. }
  339.  
  340.  
  341. void update(int node, int a, int b, int i, int num)
  342. {
  343.     if (a>b || i>b || i<a)
  344.         return;
  345.  
  346.     if (a>=i && b<=i)
  347.     {
  348.         treeNode t;
  349.         t.One = num;
  350.         t.Zero = num;
  351.  
  352.        // treeNode tt;
  353.         //tt.Query(tree[node], t);
  354.  
  355.         tree[node].updat(num);
  356.  
  357.  
  358.         return;
  359.        // return tt;
  360.     }
  361.     int left = node<<1;
  362.     int right = node<<1|1;
  363.     int mid = (a+b)>>1;
  364.  
  365.     update(left, a, mid, i, num);
  366.     update(right, mid+1, b, i, num);
  367.  
  368.     tree[node].Marge(tree[left], tree[right]);
  369. }
  370.  
  371. int main()
  372. {
  373.     READ;
  374.  
  375.  
  376.     calc();
  377.  
  378.     int n;
  379.     cin >> n;
  380.  
  381.     for (int i=1; i<=n; i++)
  382.         cin >> arr[i];
  383.  
  384.     build_tree(1, 1, n);
  385.  
  386.     int q;
  387.     cin >> q;
  388.  
  389.     while (q--)
  390.     {
  391.         char op;
  392.         int i, j;
  393.  
  394.         cin >> op;
  395.  
  396.         if (op == 'u')
  397.         {
  398.             int num;
  399.             cin >> i >> num;
  400.  
  401.             update(1, 1, n, i, num);
  402.         }
  403.  
  404.         if (op == 'q')
  405.         {
  406.             cin >> i >> j;
  407.  
  408.             if (i > j)
  409.                 swap(i, j);
  410.  
  411.             treeNode t = query(1, 1, n, i, j);
  412.  
  413.             int num;
  414.             cin >> num;
  415.  
  416.             if (num == 0)
  417.                 cout << t.Zero << endl;
  418.  
  419.             else
  420.                 cout << t.One << endl;
  421.         }
  422.     }
  423.  
  424. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement