Advertisement
Kaidul

11235

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