最優貿易簡化版
題目描述
C國有n座城市,編號是1到n,編號爲i的城市有路到編號爲i+1的城市(編號爲n的城市沒有路到其他的城市)。
C國幅員遼闊,各地的資源分佈情況各不相同,這就導致了同一種商品在不同城市的價格不一定相同。但是,同一種商品在同一個城市的買入價和賣出價始終是相同的。
商人阿龍再次來到C國旅遊。他還是想販賣水晶賺取旅費,在某個城市買入,再另一個城市賣出。
他將從編號爲a的城市到編號到b的城市。請你幫他算算,最多能賺多少錢。
注:他最多進行一次買入和一次賣出。
輸入
第一行兩個整數n和m,表示n個城市和m個詢問。
第二行n個整數,表示n座城市水晶的買入和賣出的價格。
接下來m行,每行兩個整數a、b,表示阿龍要從編號爲a的城市到編號爲b的城市(a< b);
輸出
對於每個詢問輸出阿龍能賺多少錢。
樣例輸入
6 3
2 1 3 6 4 5
1 2
2 4
1 6
樣例輸出
0
5
5
提示
【輸出輸出樣例解釋】
從1到2,無法賺錢。
從2到4,在編號爲2的城市買入,在編號爲4的城市賣出。
從1到6,在編號爲2的城市買入,在編號爲4的城市賣出。
對於20%的數據,n和m的範圍[1,500];
對於40%的數據,n和m的範圍[1,5000];
【數據範圍】
對於20%的數據,n和m的範圍[1,500];
對於40%的數據,n和m的範圍[1,5000];
對於70%的數據,n和m的範圍[1,50000];
對於100%的數據,n和m的範圍[1,500000];
#include<iostream>
#include<cstdio>
using namespace std;
struct node{
int a,b,c;
}tree[2000010];
int a[500010];
void dfs(int l,int r,int z){
if (l==r){
tree[z].a=a[l];
tree[z].b=a[l];
tree[z].c=0;
return;
}
int mid=(l+r)>>1;
dfs(l,mid,z+z);
dfs(mid+1,r,z+z+1);
tree[z].a=min(tree[z+z].a,tree[z+z+1].a);
tree[z].b=max(tree[z+z].b,tree[z+z+1].b);
tree[z].c=max(tree[z+z+1].b-tree[z+z].a,max(tree[z+z].c,tree[z+z+1].c));
}
node query(int l,int r,int z,int x,int y){
if (l>=x&&r<=y) return tree[z];
if (l>y||r<x) return (node){1<<29,-1<<29,0};
int mid=(l+r)>>1;
node xx=query(l,mid,z+z,x,y);
node yy=query(mid+1,r,z+z+1,x,y);
return (node){min(xx.a,yy.a),max(xx.b,yy.b),max(yy.b-xx.a,max(xx.c,yy.c))};
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
dfs(1,n,1);
while (m--){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",query(1,n,1,x,y).c);
}
return 0;
}