ST表

void pre()
{
	for(int i=1;i<=n;i++) f[i][0]=a[i];
	int t=log(n)/log(2);
	for(int j=1;j<=t;j++)
		for(int i=1;i+(1<<j)<=n+1;i++)
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}

int query(int l,int r)
{
	int k=log(r-l+1)/log(2);
	return max(f[l][k],f[r-(1<<k)+1][k]); 
}

int main()
{
	n=read(); m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	pre();
	
	
	while(m--)
	{
		int x=read(),y=read();
		printf("%d\n",query(x,y));
	}
}

边界状态示意图:
预处理
image

询问
image

posted @ 2022-02-26 20:06  __iostream  阅读(37)  评论(0)    收藏  举报