#include<bits/stdc++.h> #define N 200005 using namespace std; int m,n,k; int a[N],b[N],u[N]; struct MM{ int l,r,s; }tree[N<<2]; inline void build(int root,int L,int R) { tree[root].l=L; tree[root].r=R; if(L==R) return; int mid=(L+R)>>1; build(root<<1,L,mid); build(root<<1|1,mid+1,R); } inline void update(int root,int t) { if(tree[root].l==tree[root].r) { tree[root].s++;//个数加一 return; } int mid=(tree[root].l+tree[root].r)>>1; if(t<=mid) update(root<<1,t); else update(root<<1|1,t); tree[root].s=tree[root<<1].s+tree[root<<1|1].s; } inline int query(int root,int t) { if(tree[root].l==tree[root].r) return tree[root].l; if(t<=tree[root<<1].s) return query(root<<1,t); else return query(root<<1|1,t-tree[root<<1].s); } int main() { cin>>m>>n;//m个数字,n个询问 for(int i=1;i<=m;i++) { cin>>a[i]; b[i]=a[i]; } for(int i=1;i<=n;i++) cin>>u[i]; sort(b+1,b+m+1); int s=unique(b+1,b+m+1)-(b+1); //离散化,s是数组b中不重复的数的个数 build(1,1,s);//依s建树 int h=0; while(n!=h)//依次查询 { h++; for(int i=u[h-1]+1;i<=u[h];i++)//将指定区间数字加入权值线段树 { int v=lower_bound(b+1,b+s+1,a[i])-b; //v是a[i]在数组b中所处的位置(注意之前数组b排了序) update(1,v); } cout<<b[query(1,++k)]<<endl; } return 0; }
#include<cstdio> #include<queue> using namespace std; int a[30001],b[30001]; int s,m,n,x,y,i,j,k; int main() { scanf("%d",&s); for(k=1; k<=s; k++) { j=1; priority_queue<int>q1; //大根堆 priority_queue<int,vector<int>,greater<int> >q2; //小根堆 scanf("%d%d",&m,&n); for(i=1; i<=m; i++) scanf("%d",&a[i]); for(i=1; i<=n; i++) scanf("%d",&b[i]); for(i=1; i<=n; i++) { for(; j<=b[i]; j++) //将前b[i]个数字放入小根堆 q2.push(a[j]); while(q1.size()<i) //保证大根堆中有i个元素 { q1.push(q2.top()); q2.pop(); } while(!q2.empty()&&q1.top()>q2.top()) //互换堆顶元素 { x=q1.top(); y=q2.top(); q1.pop(); q2.pop(); q1.push(y); q2.push(x); } printf("%d\n",q1.top()); } if(k!=s)printf("\n"); } }