NC222087. 可爱
描述
输入描述
一共输入m+1行。
第一行输入两个数n,m,表示数列长度和询问次数。
第二行到第m+1行,每行输入三个整数x,y,表示询问包含x,x+1,...,y-1,y这段区间的最小区间。
输出描述
对于每一次询问,输出两个数l,r,表示从最小区间,中间用空格隔开,对于每次询问用换行隔开。
示例1
输入:
6 4 2 4 3 5 1 6 3 5 4 6 1 2 2 6
输出:
2 4 2 6 1 5 1 6
C++ 解法, 执行用时: 117ms, 内存消耗: 3320K, 提交时间: 2021-05-23 00:10:34
#include <stdio.h> #include <algorithm> #define MN 200000 int n,m,mn[MN*4+5],mx[MN*4+5]; void modify(int k,int l,int r,int p,int w){ if(l==r){ mn[k] = mx[k] = w; return; } int mid = (l+r)>>1; if(p<=mid) modify(k<<1,l,mid,p,w); else modify(k<<1|1,mid+1,r,p,w); mn[k] = std::min(mn[k<<1],mn[k<<1|1]); mx[k] = std::max(mx[k<<1],mx[k<<1|1]); } int qmin(int k,int l,int r,int L,int R){ if(l==L&&r==R) return mn[k]; int mid = (l+r)>>1; if(R<=mid) return qmin(k<<1,l,mid,L,R); if(L>mid) return qmin(k<<1|1,mid+1,r,L,R); return std::min(qmin(k<<1,l,mid,L,mid),qmin(k<<1|1,mid+1,r,mid+1,R)); } int qmax(int k,int l,int r,int L,int R){ if(l==L&&r==R) return mx[k]; int mid = (l+r)>>1; if(R<=mid) return qmax(k<<1,l,mid,L,R); if(L>mid) return qmax(k<<1|1,mid+1,r,L,R); return std::max(qmax(k<<1,l,mid,L,mid),qmax(k<<1|1,mid+1,r,mid+1,R)); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int a; scanf("%d",&a); modify(1,1,n,a,i); } while(m--){ int l,r; scanf("%d%d",&l,&r); printf("%d %d\n",qmin(1,1,n,l,r),qmax(1,1,n,l,r)); } }