Infinite Inversions 留个坑
作者:互联网
线段树板子先打上
#include<iostream>
#define ll long long
#define MAXN 100005
using namespace std;//区间最大值与最小值
ll A[MAXN],mx[MAXN<<2],lazy[MAXN<<2],mn[MAXN<<2],sum[MAXN<<2];
void PushUp(ll rt){
mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
mn[rt]=min(mn[rt<<1],mn[rt<<1|1]);
}
// void PushDown(ll rt, ll len){
// if(lazy[rt]==0) return;
// lazy[rt<<1]+=lazy[rt];
// lazy[rt<<1|1]+=lazy[rt];
// sum[rt<<1]+=lazy[rt]*(len-(len>>1));
// sum[rt<<1|1]+=lazy[rt]*(len>>1);
// lazy[rt]=0;
// }
void Build(ll l,ll r,ll rt){
if(l==r){mx[rt]=A[l];mn[rt]=A[l];return;}
ll m=(l+r)>>1;
Build(l,m,rt<<1);
Build(m+1,r,rt<<1|1);
PushUp(rt);
}
// void Update(ll L,ll R,ll l,ll r,ll C,ll rt){
// if(l>=L&&r<=R){sum[rt]+=C*(r-l+1);lazy[rt]+=C;return;}
// PushDown(rt,r-l+1);
// ll m=(l+r)>>1;
// if(m>=L) Update(L,R,l,m,C,rt<<1);
// if(m<R) Update(L,R,m+1,r,C,rt<<1|1);
// PushUp(rt);
// }
ll QueryMx(ll L,ll R,ll l,ll r,ll rt){
if(l>=L&&r<=R) return mx[rt];
ll m=(l+r)>>1,ANS;
if(m>=L) ANS=QueryMx(L,R,l,m,rt<<1);
if(m<R) ANS=max(ANS,QueryMx(L,R,m+1,r,rt<<1|1));
return ANS;
}
ll QueryMn(ll L,ll R,ll l,ll r,ll rt){
if(l>=L&&r<=R) return mn[rt];
ll m=(l+r)>>1,ANS;
if(m>=L) ANS=QueryMn(L,R,l,m,rt<<1);
if(m<R) ANS=min(ANS,QueryMn(L,R,m+1,r,rt<<1|1));
return ANS;
}
ll Query(ll a,ll b,ll n){
return QueryMx(a,b,1,n,1)-QueryMn(a,b,1,n,1);
}
int main(){
ll n;
cin>>n;
for(int u=1;u<=n;u++) cin>>A[u];
Build(1,n,1);
while(true){
ll a,b,c,d;
cin>>b>>c;
//cout<<Query(b,c,n)<<endl;
cout<<QueryMx(b,c,1,n,1)<<endl;
cout<<QueryMn(b,c,1,n,1)<<endl;
}
return 0;
}
标签:rt,留个,ll,Inversions,MAXN,Build,&&,ANS,Infinite 来源: https://www.cnblogs.com/cookiecheetah/p/15115352.html