codevs 2021 中庸之道
求区间第(len+1)/2大,主席树裸题
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1010 using namespace std; int root[maxn],lc[maxn*30],rc[maxn*30],sum[maxn*30],sz,n,m; int a[maxn],hash[maxn],cnt,val[maxn],w[maxn]; void insert(int pre,int &now,int l,int r,int val){ now=++sz; sum[now]=sum[pre]+1; if(l==r)return; int mid=(l+r)>>1; lc[now]=lc[pre];rc[now]=rc[pre]; if(val<=mid)insert(lc[pre],lc[now],l,mid,val); else insert(rc[pre],rc[now],mid+1,r,val); } int query(int x,int y,int l,int r,int k){ if(l==r)return l; int tmp=sum[lc[y]]-sum[lc[x]]; int mid=(l+r)>>1; if(tmp>=k)return query(lc[x],lc[y],l,mid,k); else return query(rc[x],rc[y],mid+1,r,k-tmp); } int main(){ freopen("Cola.txt","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); val[i]=hash[i]=a[i]; } sort(a+1,a+n+1); cnt=unique(a+1,a+n+1)-a-1; for(int i=1;i<=n;i++){ hash[i]=lower_bound(a+1,a+cnt+1,hash[i])-a; w[hash[i]]=val[i]; } for(int i=1;i<=n;i++) insert(root[i-1],root[i],1,cnt,hash[i]); int l,r; for(int i=1;i<=m;i++){ scanf("%d%d",&l,&r); printf("%d\n",w[query(root[l-1],root[r],1,cnt,(r-l+2)/2)]); } return 0; }