Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 13131 | Accepted: 4828 |
Description
You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several queries consisting of indices i and j (1 ≤ i ≤ j ≤ n). For each query, determine the most frequent value among the integers ai , ... , aj.
Input
The input consists of several test cases. Each test case starts with a line containing two integers n and q (1 ≤ n, q ≤ 100000). The next line contains n integers a1 , ... , an (-100000 ≤ ai ≤ 100000, for each i ∈ {1, ..., n}) separated by spaces. You can assume that for each i ∈ {1, ..., n-1}: ai ≤ ai+1. The following q lines contain one query each, consisting of two integers i and j (1 ≤ i ≤ j ≤ n), which indicate the boundary indices for the
query.
The last test case is followed by a line containing a single 0.
Output
For each query, print one line with one integer: The number of occurrences of the most frequent value within the given range.
Sample Input
10 3 -1 -1 1 1 1 1 3 10 10 10 2 3 1 10 5 10 0
Sample Output
1 4 3
Source
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int b[100010][30] , num[100010] , top , p[100010] , left[100010] , right[100010];
void RMQ_init(int n)
{
int i , j ;
for(i = 0 ; i < n ; i++)
b[i][0] = num[i] ;
for(j = 1 ; (1<<j) <= n ; j++)
for(i = 0 ; i+(1<<j)-1 < n ; i++)
b[i][j] = max( b[i][j-1],b[i+ (1<<(j-1) ) ][j-1] );
}
int RMQ(int l,int r)
{
int k = 0 ;
if(l > r)
return 0;
while( 1<<(k+1) <= r-l+1 )
k++ ;
return max( b[l][k],b[ r-(1<<k)+1 ][k] ) ;
}
int main()
{
int i , n , m , k , a ;
while(scanf("%d", &n) && n)
{
scanf("%d", &m);
top = 0 ;
memset(num,0,sizeof(num));
for(i = 0 ; i < n ; i++)
{
scanf("%d", &a);
if(i == 0)
{
k = a ;
num[top]++ ;
left[0] = 0 ;
}
else
{
if(k == a)
num[top]++ ;
else
{
k = a ;
right[top] = i-1 ;
num[++top]++ ;
left[top] = i ;
}
}
p[i] = top ;
}
right[top] = n-1 ;
RMQ_init(top+1);
while(m--)
{
int r , l ;
scanf("%d %d", &l, &r);
l-- ; r-- ;
if( p[l] == p[r] )
{
printf("%d\n", r-l+1);
continue;
}
k = 0 ;
k = max(k,right[ p[l] ]-l+1);
k = max(k,r-left[ p[r] ]+1 );
k = max(k,RMQ(p[l]+1,p[r]-1));
printf("%d\n", k);
}
}
return 0;
}