大顶堆和小顶堆。
/*Accepted 624K 157MS C++ 906B 2012-07-30 17:18:34*/ #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> using namespace std; const int MAXM = 30030; int n, m; int a[MAXM]; int main() { while(scanf("%d%d", &m, &n) == 2) { int i, j, u; priority_queue< int, vector<int>, greater<int> > q1; priority_queue< int, vector<int>, less<int> > q2; for(i = 0; i < m ; i ++) { scanf("%d", &a[i]); } for(i = 0, j = 0; i < n; i ++) { scanf("%d", &u); for( ; j < u; j ++) { q1.push(a[j]); if(!q2.empty() && q1.top() < q2.top()) q1.push(q2.top()), q2.pop(), q2.push(q1.top()), q1.pop(); } q2.push(q1.top()); q1.pop(); printf("%d\n", q2.top()); } return 0; } }