记录编号 166849 评测结果 AAAAAAAAAAAAAAAAAA
题目名称 [USACO Jan07] 均衡队形 最终得分 100
用户昵称 Gravatar一個人的雨 是否通过 通过
代码语言 C++ 运行时间 2.879 s
提交时间 2015-06-16 14:42:32 内存使用 36.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#define SpeedUp ios::sync_with_stdio(false)
using namespace std;
struct TREE{
	int sum1,sum2;
	int l;
	int r;
	TREE *lc,*rc;
	TREE():sum1(0),sum2(0){}
};
int n,m;
int ans;
int a[10000000];

void build (TREE *p,int l,int r)
{
	p->l=l;
	p->r=r;
	if (l+1==r)
	 p->sum1=p->sum2=a[l];
	else if (l+1<r)
	{
		p->lc=new TREE;
		p->rc=new TREE;
		build(p->lc,l,(l+r)/2);
		build(p->rc,(l+r)/2,r);
		p->sum1=max(p->lc->sum1,p->rc->sum1);
		p->sum2=min(p->lc->sum2,p->rc->sum2);
	}
}

int Q1(TREE *p,int l,int r){
	if (l<=p->l&&p->r<=r) return ans=max(ans,p->sum1);
	else
	{
		if (l<(p->l+p->r)/2)
			ans=max(Q1(p->lc,l,r),ans);
		if (r>(p->l+p->r)/2)
			ans=max(Q1(p->rc,l,r),ans);
		return ans;
	}
}

int Q2(TREE *p,int l,int r){
	if (l<=p->l&&p->r<=r) return ans=min(ans,p->sum2);
	else
	{
		if (l<(p->l+p->r)/2)
			ans=min(Q2(p->lc,l,r),ans);
		if (r>(p->l+p->r)/2)
			ans=min(Q2(p->rc,l,r),ans);
		return ans;
	}
}
int main()
{
	freopen("lineup.in","r",stdin);
	freopen("lineup.out","w",stdout);
	cin>>n>>m;
	for (int i=1;i<=n;++i)
	 cin>>a[i];
	TREE *root=new TREE;
	build(root,1,n+1);
	int x,y;	
	for (int i=1;i<=m;++i)
	{
	    ans=-0x7f;
		cin>>x>>y;
		int A1=Q1(root,x,y+1);
		ans=200000000;
		int A2=Q2(root,x,y+1);
		cout<<A1-A2<<endl;
	}
}