#include<bits/stdc++.h>
#define int long long
#define stoSHYorz 50001
using namespace std;
int n,q,v,maxn[stoSHYorz * 4],minn[stoSHYorz * 4],s,t;
void build(int k,int l,int r)
{
if(l == r)
{
cin >> v;
maxn[k] = minn[k] = v;
return;
}
int mid = (l + r) >> 1;
build(2 * k,l,mid);
build(2 * k + 1,mid + 1,r);
maxn[k] = max(maxn[k * 2],maxn[k * 2 + 1]);
minn[k] = min(minn[k * 2],minn[k * 2 + 1]);
}
int qmax(int k,int l,int r,int x,int y)
{
if(l >= x && r <= y) return maxn[k];
if(l > y || r < x) return -0x3f3f3f3f3f3f3f3f;
int mid = (l + r) >> 1;
return max(qmax(k * 2,l,mid,x,y),qmax(k * 2 + 1,mid + 1,r,x,y));
}
int qmin(int k,int l,int r,int x,int y)
{
if(l >= x && r <= y) return minn[k];
if(l > y || r < x) return 0x3f3f3f3f3f3f3f3f;
int mid = (l + r) >> 1;
return min(qmin(k * 2,l,mid,x,y),qmin(k * 2 + 1,mid + 1,r,x,y));
}
signed main()
{
freopen("determine.in","r",stdin);
freopen("determine.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
build(1,1,n);
for(int i = 1;i <= q;i++)
{
cin >> s >> t;
cout << qmax(1,1,n,s,t) - qmin(1,1,n,s,t) << '\n';
}
return 0;
}
共 9 条回复
谢谢!
已调
“但是改正之后任然 0 pts qwq...”why?
不是哥们怎么会用线段树
找到了一个,就是没有判断 s > t 的情况,导致答案中会有负数的情况,但是改正之后任然 0 pts qwq...
我只会st表
站长,样例应该没问题
qp
感觉样例有问题