int buildSegmentTree(int begin,int end,int rootIndex){ segmentTree[rootIndex].begin=begin; segmentTree[rootIndex].end=end; if(end-begin==1) segmentTree[rootIndex].max=sections[begin].end-sections[begin].begin; else{ int mid=(begin+end)/2; segmentTree[rootIndex].max=std::max(buildSegmentTree(begin,mid,leftChild(rootIndex)), buildSegmentTree(mid,end,rightChild(rootIndex))); } return segmentTree[rootIndex].max; }
int main(){ while(true){ scanf("%d",&sequenceNum); if(sequenceNum==0) return 0; int queryNum; scanf("%d",&queryNum); for(int sequenceIndex=0;sequenceIndex<sequenceNum;sequenceIndex++) scanf("%d",sequence+sequenceIndex); splitIntoSections(); buildSegmentTree(0,sectionNum,0); while(queryNum--){ int begin,end; scanf("%d%d",&begin,&end); begin--; if(sequence[begin]==sequence[end-1]){ printf("%d\n",end-begin); continue; } int firstSectionIndex=findSectionIndex(sequence[begin]); int firstSectionLen=sections[firstSectionIndex].end-begin; int lastSectionIndex=findSectionIndex(sequence[end-1]); int lastSectionLen=end-sections[lastSectionIndex].begin; int midSectionLenMax=querySegmentTree(firstSectionIndex+1,lastSectionIndex,0); printf("%d\n",std::max(midSectionLenMax,std::max(firstSectionLen,lastSectionLen))); } } }
NumArray(vector<int> &nums) { numbers = nums; if(nums.size() >= 1){ rootNode = buildSegmentTree(0, 0, nums.size()-1, nums); } }