提交时间:2024-12-08 14:18:38

运行 ID: 35265

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back typedef long long ll; using namespace std; const int maxn=3e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,a[maxn],b[maxn];ll m; bool chk(int lim){ up(i,1,n)b[i]=(a[i]>=lim); vector<int>v; int ct=0;up(i,1,n)ct+=(!b[i]); ll res=0; up(i,1,n){ int j=i; while(j<=n&&b[i]==b[j])j++;j--; if(!b[i]){ if(v.empty()||v.back()==-1)v.p_b(j-i+1); else v.back()+=j-i+1;i=j; } else { if((j-i+1)&1)v.p_b(-1); res+=ct*1ll*((j-i+1)/2);i=j; } } up(i,1,n-ct)res+=(i+1)/2; ll s=0;down(i,int(v.size())-1,0)if(v[i]==-1)res+=s;else s+=v[i]; s=0;int p=0;for(int x:v)if(x!=-1)s+=x;else p++,res+=s/2+(s&1)*((s+p)&1); return (res>=m); } void slv(){ n=read(),m=read(); up(i,1,n)a[i]=read(); vector<int>A;up(i,1,n)A.p_b(a[i]); sort(A.begin(),A.end()); int l=0,r=n; while(l+1<r){ int mid=l+r>>1; if(chk(A[mid]))l=mid; else r=mid; }printf("%d\n",A[l]); } int main(){ //freopen("card.in","r",stdin); //freopen("card.out","w",stdout); int t=read();while(t--)slv(); fclose(stdin); fclose(stdout); return 0; }