voidrmq(){ int end=log(n+0.0)/log(2.0); rep(i,1,n)mx[i][0]=mn[i][0]=a[i]; rep(j,1,end){ int end_i=n-(1<<j)+1; rep(i,1,end_i){ mx[i][j]=max(mx[i][j-1],mx[i+(1<<j-1)][j-1]); mn[i][j]=min(mn[i][j-1],mn[i+(1<<j-1)][j-1]); } } } intask(int l,int r){ int k=log(r-l+1.0)/log(2.0); int ans1=max(mx[l][k],mx[r-(1<<k)+1][k]); int ans2=min(mn[l][k],mn[r-(1<<k)+1][k]); return ans1-ans2; }