#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <string>
using namespace std;
const int maxn = 100010+100;
int dp_max[maxn][20];
int f[maxn];
int n;
int num[maxn];
void ST()
{
for (int i = 1; i <= n; ++i)
{
dp_max[i][0] = f[i];
}
int k = log(double(n+1))/log(2.0);
for (int j = 1; j <= k; ++j)
{
for(int i = 1; i+(1<<j)-1<=n; i++)
{
dp_max[i][j] = max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j-1]);
}
}
}
int query(int s,int e)
{
if (s > e)
{
return 0;
}
int len = e-s+1;
int k = log(double(len))/log(2.0);
return max(dp_max[s][k],dp_max[e-(1<<k)+1][k]) ;
}
int main(int argc, char const *argv[])
{
int q;
while(scanf("%d",&n)!=EOF && n)
{
scanf("%d",&q);
for (int i = 1; i <= n; ++i)
{
scanf("%d",&num[i]);
if (i == 1)
{
f[i] = 1;
continue;
}
if (num[i] == num[i-1])
{
f[i] = f[i-1]+1;
}else
{
f[i] = 1;
}
}
ST();
for (int i = 1; i <= q; ++i)
{
int a,b;
scanf("%d%d",&a,&b);
int t=a;
while(t<=b&&num[t]==num[t-1])
t++;
int cnt=query(t,b);
int ans=max(t-a,cnt);
printf("%d\n",ans);
}
}
return 0;
}
poj_3386 Frequent values
最新推荐文章于 2017-02-12 10:49:39 发布