测试2T3
问题 C: 最优贸易简化版
时间限制: 1 Sec 内存限制: 128 MB提交: - 解决: -
[提交][讨论版]
题目描述
输入
输出
样例输入
6 3 2 1 3 6 4 5 1 2 2 4 1 6
样例输出
0 5 5
提示
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 2000005
int a[N];
struct note{
int min,max,val;
}tree[N];
void build(int v,int l,int r)
{
if(l==r)
{
tree[v].min=a[l];
tree[v].max=a[l];
tree[v].val=0;
return;
}
int mid=(l+r)>>1;
build(v<<1,l,mid);
build(v<<1|1,mid+1,r);
tree[v].val=max(tree[v<<1].val,max(tree[v<<1|1].val,tree[v<<1|1].max-tree[v<<1].min));
tree[v].max=max(tree[v<<1].max,tree[v<<1|1].max);
tree[v].min=min(tree[v<<1].min,tree[v<<1|1].min);
}
note search(int v,int l,int r,int x,int y)
{
//cout<<v<<' '<<l<<' '<<r<<' '<<x<<' '<<y<<endl;
if(l==x&&r==y)
return tree[v];
int mid=(l+r)>>1;
if(mid<x)return search(v<<1|1,mid+1,r,x,y);else
if(y<=mid) return search(v<<1,l,mid,x,y);else
{
//return max(tree[v<<1],max(tree[v<<1|1],treemax[v<<1|1]-treemin[v<<1]));
note nt1,nt2=search(v<<1,l,mid,x,mid),nt3=search(v<<1|1,mid+1,r,mid+1,y);
nt1.val=max(nt2.val,max(nt3.val,nt3.max-nt2.min));
nt1.min=min(nt2.min,nt3.min);
nt1.max=max(nt2.max,nt3.max);
return nt1;
}
}
int n,m;
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++)
{
int l,r;
scanf("%d %d",&l,&r);
printf("%d\n",search(1,1,n,l,r).val);
}
return 0;
}