CF765F Souvenirs题解
询问区间最小差。
离线处理。只考虑
考虑对于
注意到这些
即为
容易发现如果
可以产生贡献的
且其一定满足
用扫描线找一下值域范围内
考虑
前面扫描线有一个
code
//省略了两棵线段树。T是单点赋值区间min,T2是单点赋值区间max。
struct Que{
int l,r,id;
bool operator<(Que ano)const{
return r<ano.r;
}
}Q[N];
int X[N],len;
int a[N];
int ans[N];
void calc(int n,int m){
T.build(1,1,n);T2.build(1,1,len);T2.n=len;
for(int i=1,j=1;i<=n;i++){
int limit=inf;
while(1){
int tmp=upper_bound(X+1,X+1+len,limit)-X-1;
if(X[tmp]<a[i])
break;
int nw=T2.query(a[i],tmp);
if(nw<=0)
break;
T.update(nw,X[a[nw]]-X[a[i]]);
limit=(X[a[nw]]+X[a[i]]+1)/2-1;
}
T2.update(a[i],i);
while(j<=m&&Q[j].r==i){
ans[Q[j].id]=min(ans[Q[j].id],T.query(Q[j].l,i));
j++;
}
//cout<<i<<endl;
//for(int k=1;k<=i;k++)
// print(T.query(k,k)),pc(' ');pc('\n');
}//cout<<endl;
}
signed main(){
int n=read();T.n=n;
for(int i=1;i<=n;i++)
X[i]=a[i]=read();
sort(X+1,X+1+n);len=unique(X+1,X+1+n)-X-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(X+1,X+1+len,a[i])-X;
int m=read();
for(int i=1;i<=m;i++){
int l=read(),r=read();
Q[i]={l,r,i};
}
sort(Q+1,Q+1+m);
a[0]=-1;
memset(ans,0x3f,sizeof(ans));
calc(n,m);
reverse(a+1,a+1+n);
for(int i=1;i<=m;i++){
int l=Q[i].l,r=Q[i].r;
Q[i].l=n-r+1,Q[i].r=n-l+1;
}
sort(Q+1,Q+1+m);
calc(n,m);
for(int i=1;i<=m;i++)
print(ans[i]),pc('\n');
return 0;
}