5 2
1 3 2 4 5
1 4
2 5
4 1
5 2
刷水了……裸的线段树维护最大最小值
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<deque> #include<set> #include<map> #include<ctime> #define LL long long #define inf 0x7ffffff #define pa pair<int,int> #define pi 3.1415926535897932384626433832795028841971 using namespace std; inline LL read() { LL x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } struct segtree{ int l,r,mn,mx; }tree[300000]; int n,m; int a[50010]; inline void update(int k) { tree[k].mx=max(tree[k<<1].mx,tree[k<<1|1].mx); tree[k].mn=min(tree[k<<1].mn,tree[k<<1|1].mn); } inline void buildtree(int k,int l,int r) { tree[k].l=l;tree[k].r=r; if (l==r) { tree[k].mx=tree[k].mn=a[l]; return; } int mid=(l+r)>>1; buildtree(k<<1,l,mid); buildtree(k<<1|1,mid+1,r); update(k); } inline int query(int k,int l,int r,int opr) { int x=tree[k].l,y=tree[k].r; if (x==l&&y==r) { if (opr==1)return tree[k].mx; if (opr==2)return tree[k].mn; } int mid=(x+y)>>1; if (r<=mid)return query(k<<1,l,r,opr); if (l>mid)return query(k<<1|1,l,r,opr); if (opr==1)return max(query(k<<1,l,mid,opr),query(k<<1|1,mid+1,r,opr)); if (opr==2)return min(query(k<<1,l,mid,opr),query(k<<1|1,mid+1,r,opr)); } int main() { n=read();m=read(); for(int i=1;i<=n;i++)a[i]=read(); buildtree(1,1,n); for (int i=1;i<=m;i++) { int x=read(),y=read(); printf("%d %d\n",query(1,x,y,1),query(1,x,y,2)); } return 0; }
原文:http://www.cnblogs.com/zhber/p/4093578.html