Advertisement
Kaidul

11402 Ahoy, Pirates!

Jun 3rd, 2013
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <cmath>
  5. using namespace std;
  6.  
  7. #define rep(i,n) for(__typeof(n) i=0; i<(n); i++)
  8. #define FOR(i,a,b) for(__typeof(b) i=(a); i<=(b); i++)
  9.  
  10. typedef long long i64;
  11. typedef unsigned long long ui64;
  12. /** function **/
  13. #define SDi(x) sf("%d",&x)
  14. #define pf printf
  15. #define print(x) pf("%d ", x)
  16. #define println(x) pf("%d\n", x)
  17. #define sf scanf
  18. #define READ(f) freopen(f, "r", stdin)
  19.  
  20. #define Max 1024001
  21.  
  22. enum RequestCode {barbary, buccaneer, inverse};
  23.  
  24. vector <int> segment_tree, lazy;
  25.  
  26. int data[Max];
  27. int arrLength;
  28.  
  29.  
  30. void initSegmentTree() {
  31.     int length = 2 * pow(2.0, floor(log((double) arrLength ) / log(2.0)) + 1 );
  32.     segment_tree.clear();
  33.     lazy.clear();
  34.     segment_tree.resize(length, 0);
  35.     lazy.resize(length, 0);
  36. }
  37.  
  38.  
  39. void buildHelper( int node, int begin, int end ) {
  40.     if (begin == end) {
  41.         segment_tree[node] = data[begin];
  42.         return;
  43.     }
  44.     int leftIndx = 2 * node, rightIndx = 2 * node + 1;
  45.  
  46.     buildHelper(leftIndx, begin, (begin + end) / 2);
  47.     buildHelper(rightIndx, (begin + end) / 2 + 1, end);
  48.  
  49.     segment_tree[node] = segment_tree[leftIndx] + segment_tree[rightIndx];
  50.  
  51. }
  52.  
  53. void buildSegmentTree() {
  54.     buildHelper(1, 0, arrLength - 1);
  55. }
  56.  
  57. int queryHelper(int node, int begin, int end, int i, int j) {
  58.     // if the current interval does not intersect query interval
  59.     if (i > end || j < begin) return -1;
  60.  
  61.     if (begin >= i && end <= j) return segment_tree[node];
  62.  
  63.     // compute the minimum position in the left and right part of the interval
  64.     int pos1 = queryHelper(2 * node, begin, (begin + end) / 2, i, j);
  65.     int pos2 = queryHelper(2 * node + 1, (begin + end) / 2 + 1, end, i, j);
  66.  
  67.     // return the position where the overall minimum is
  68.     if(pos1 == -1) return pos2; // can happen if we try to access segment outside query
  69.     if(pos2 == -1) return pos1;
  70.  
  71.     return pos1 + pos2;
  72. }
  73.  
  74. int query(int lower, int upper) {
  75.     return queryHelper(1, 0, arrLength - 1, lower, upper);
  76. }
  77.  
  78. void updateHelper(RequestCode code, int node, int begin, int end, int i, int j) {
  79.  
  80.     if( i > end || j < begin || begin > end ) return;
  81.  
  82.     if( begin == end && begin >= i && begin <= j) {
  83.         if(code == inverse) {
  84.             data[begin] = data[begin] == 1 ? 0 : 1;
  85.         } else {
  86.             data[begin] = code;
  87.         }
  88.         segment_tree[node] = data[begin];
  89.         return;
  90.     }
  91.     int leftIndx = node * 2, rightIndx = node * 2 + 1;
  92.  
  93.     updateHelper(code, leftIndx, begin, ( begin + end ) / 2, i, j);
  94.     updateHelper(code, rightIndx, ( begin + end ) / 2 + 1, end, i, j);
  95.  
  96.     int lContent = segment_tree[leftIndx], rContent = segment_tree[rightIndx];
  97.  
  98.     segment_tree[node] = lContent + rContent;
  99. }
  100.  
  101. void update(RequestCode code, int begin, int end) {
  102.     updateHelper(code, 1, 0, arrLength - 1, begin, end);
  103. }
  104.  
  105. int main(void) {
  106.     #ifndef ONLINE_JUDGE
  107.         freopen("input.txt", "r", stdin);
  108.     #endif
  109.     int tcase;
  110.     int M, T, q;
  111.     string str;
  112.     char cmd;
  113.     int index, begin, end, caseNo = 0, qn;
  114.     SDi(tcase);
  115.     while(tcase--) {
  116.         SDi(M);
  117.         index = 0, qn = 0;
  118.         rep(i, M) {
  119.             SDi(T);
  120.             getchar();
  121.             getline(cin, str);
  122.             rep(i, T)
  123.                 rep(j, str.length())
  124.                     data[index++] = str[j] == '1';
  125.         }
  126.         arrLength = index;
  127.  
  128. #ifndef ONLINE_JUDGE
  129.         rep(i, arrLength) print(data[i]);
  130.         pf("\n");
  131.         println(arrLength);
  132. #endif
  133.  
  134.         initSegmentTree();
  135.         buildSegmentTree();
  136.  
  137.         pf("Case %d:\n", ++caseNo);
  138.         SDi(q);
  139.         rep(i, q) {
  140.             sf(" %c %d %d", &cmd, &begin, &end);
  141.             if(cmd == 'S') {
  142.                 pf("Q%d: %d\n", ++qn, query(begin, end));
  143.             } else {
  144.                 RequestCode code;
  145.                 switch(cmd) {
  146.                     case 'F':
  147.                         code = buccaneer;
  148.                         break;
  149.                     case 'E':
  150.                         code = barbary;
  151.                         break;
  152.                     case 'I':
  153.                         code = inverse;
  154.                         break;
  155.                 }
  156.                 update(code, begin, end);
  157. #ifndef ONLINE_JUDGE
  158.                 rep(i, arrLength) print(data[i]);
  159.                 pf("\n");
  160. #endif
  161.             }
  162.         }
  163.     }
  164.     return 0;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement