uva 11235-Frequent values(RMQ問題)

852 ワード

無降順配列の整数配列a 1,a 2を与えます.anさん、あなたの任務は一連の問い合わせ(i,j)に対して、ai,ai+1と答えます.ajにおける出現回数が最も多い値の出現回数.
#include
#include
#include
#define mx 100000+10
#define max(x,y) (x)>(y) ? (x) : (y)

using namespace std;

int n,m,d[mx][18];
int a[mx],count[mx],num[mx],l[mx],r[mx];

void init()
{
	int i,j;
	for(i=0;iy) return 0;
	int k=0;
	while((1<a[i-1]) 
			{
				l[m++]=i;
				if(i) r[m-2]=i-1;
			}
			num[i]=m-1;
			count[m-1]++;
		}
		r[m-1]=i-1;
		init();
		while(q--)
		{
			scanf("%d%d",&i,&j);i--;j--;
			if(num[i]==num[j])
			{
				printf("%d
",j-i+1);continue; } res=rmq(num[i]+1,num[j]-1); res=max(res,r[num[i]]-i+1); printf("%d
",max(res,j-l[num[j]]+1)); } } return 0; }