Advertisement
Kaidul

11235

Apr 18th, 2013
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.87 KB | None | 0 0
  1. /* unsolved */
  2. #include <iostream>
  3. #include <vector>
  4. #include <map>
  5. #include <cmath>
  6. #include <fstream>
  7. using namespace std;
  8.  
  9. #define rep(i,n) for(__typeof(n) i=0; i<(n); i++)
  10. #define READ(f) freopen(f, "r", stdin)
  11.  
  12. #define Max 100010
  13. vector <int> segment_tree;
  14.  
  15. int data[Max];
  16. size_t arrLength;
  17.  
  18.  
  19. void initSegmentTree() {
  20.     int length = 2 * pow(2.0, floor(log((double) arrLength ) / log(2.0)) + 1 );
  21.     segment_tree.clear();
  22.     segment_tree.resize(length, 0);
  23. }
  24.  
  25.  
  26. void buildHelper( int node, int begin, int end ) {
  27.     if (begin == end) {
  28.         segment_tree[node] = begin;
  29.         return;
  30.     }
  31.     int leftIndx = 2 * node, rightIndx = 2 * node + 1;
  32.  
  33.     buildHelper( leftIndx, begin, (begin + end) / 2);
  34.     buildHelper(rightIndx, (begin + end) / 2 + 1, end);
  35.  
  36.     int lContent = segment_tree[leftIndx], rContent = segment_tree[rightIndx];
  37.  
  38.     segment_tree[node] = ( data[lContent] >= data[rContent] ) ? lContent : rContent;
  39.  
  40. }
  41.  
  42. void buildSegmentTree() {
  43.     buildHelper(1, 0, arrLength - 1);
  44. }
  45.  
  46. int queryHelper( int node, int begin, int end, int i, int j) {
  47.     if (i > end || j < begin) return -1;
  48.  
  49.     if (begin >= i && end <= j) return segment_tree[node];
  50.  
  51.     int pos1 = queryHelper(2 * node, begin, (begin + end) / 2, i, j);
  52.     int pos2 = queryHelper(2 * node + 1, (begin + end) / 2 + 1, end, i, j);
  53.  
  54.     if(pos1 == -1) return pos2;
  55.     if(pos2 == -1) return pos1;
  56.  
  57.     return (data[pos1] >= data[pos2]) ? pos1 : pos2;
  58. }
  59.  
  60. int query(int lower, int upper) {
  61.     return queryHelper(1, 0, arrLength - 1, lower, upper);
  62. }
  63.  
  64. int main() {
  65.     READ("in.txt");
  66.     int n, q, begin, end, result;
  67.     while(cin >> n && n) {
  68.         cin >> q;
  69.         arrLength = n;
  70.         map <int , int> track;
  71.         rep(i, n) {
  72.             cin >> data[i];
  73.             track[data[i]] += 1;
  74.         }
  75.         rep(i, n) data[i] = track[data[i]];
  76.         initSegmentTree();
  77.         buildSegmentTree();
  78.         rep(i, q) {
  79.             cin >> begin >> end;
  80.             begin--, end--;
  81.             if(begin == end) {
  82.                 cout << 1 << "\n";
  83.                 continue;
  84.             }
  85.             if(data[begin] == data[end]) {
  86.                 cout << end - begin + 1 << "\n";
  87.                 continue;
  88.             }
  89.             if(begin > 0 || end < arrLength - 1) {
  90.                 if(begin > 0 && end < arrLength - 1) {
  91.                     int subq1 = 1, subq2 = 1;
  92.                     if(data[begin - 1] == data[begin]) {
  93.                         for(int i = begin + 1; data[begin] == data[i] && i <= end; i++) subq1++;
  94.                     }
  95.                     if(data[end + 1] == data[end]) {
  96.                         for(int i = end - 1; data[end] == data[i] && i >= begin; i--) subq2++;
  97.                     }
  98.                     if((end - begin + 1) - (subq1 + subq2) > 0) {
  99.                         int temp = max(subq1, data[query(begin + subq1, end - subq2)]);
  100.                         result = max(temp, subq2);
  101.                     } else result = (subq1, subq2);
  102.                 } else if(begin > 0 && end == arrLength - 1) {
  103.                     if(data[begin - 1] == data[begin]) {
  104.                         int subq = 1;
  105.                         for(int i = begin + 1; data[begin] == data[i] && i <= end; i++) subq++;
  106.                         result = max(data[query(begin + subq, end)], subq);
  107.                     } else result = data[query(begin, end)];
  108.                 } else {
  109.                     if(data[end + 1] == data[end]) {
  110.                         int subq = 1;
  111.                         for(int i = end - 1; data[end] == data[i] && i >= begin; i--) subq++;
  112.                         result = max(data[query(begin, end - subq)], subq);
  113.                     } else result = data[query(begin, end)];
  114.                 }
  115.             } else result = data[query(begin, end)];
  116.             cout << result << "\n";
  117.         }
  118.     }
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement