小数据活了,大数据死了,我的心也死了(50pts)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1,M=2e5+1;
#define int long long
int n,m,f,ans,maxi;
int root[M],tot;
struct student{
int a,b;
}d[M];
struct tree{
int sonl,sonr,sum,cnt;
}tr[N<<6];
bool cmp(student aa,student bb) {return aa.a<bb.a;}
void build(int k,int l,int r)
{
if(l==r) return;
int mid=(l+r)>>1;
tr[k].sonl=++tot;
build(tot,l,mid);
tr[k].sonr=++tot;
build(tot,mid+1,r);
}
void add(int k1,int k2,int l,int r,int x,int v)
{
tr[k1].sum=tr[k2].sum+v;
tr[k1].cnt=tr[k2].cnt+1;
if(l==r) return;
int mid=(l+r)>>1;
if(x<=mid)
{
tr[k1].sonr=tr[k2].sonr;
tr[k1].sonl=++tot;
add(tot,tr[k2].sonl,l,mid,x,v);
}
else
{
tr[k1].sonl=tr[k2].sonl;
tr[k1].sonr=++tot;
add(tot,tr[k2].sonr,mid+1,r,x,v);
}
}
int query(int k1,int k2,int l,int r,int x,int s,int ss)
{
if(l==r) return ss+tr[k1].sum-tr[k2].sum;
int mid=(l+r)>>1;
if(s+tr[tr[k1].sonl].cnt-tr[tr[k2].sonl].cnt>=x)
return query(tr[k1].sonl,tr[k2].sonl,l,mid,x,s,ss);
else
return query(tr[k1].sonr,tr[k2].sonr,mid+1,r,x,s+tr[tr[k1].sonl].cnt-tr[tr[k2].sonl].cnt,ss+tr[tr[k1].sonl].sum-tr[tr[k2].sonl].sum);
}
signed main()
{
scanf("%lld%lld%lld",&m,&n,&f);
for(int i=1;i<=n;i++) scanf("%lld%lld",&d[i].a,&d[i].b),maxi=max(maxi,d[i].b);
sort(d+1,d+1+n,cmp);
root[0]=++tot;
build(tot,0,maxi);
for(int i=1;i<=n;i++)
{
root[i]=++tot;
add(tot,root[i-1],0,maxi,d[i].b,d[i].b);
}
for(int i=n-m/2;i>=(m+1)/2;i--)
{
int mon=query(root[i-1],root[0],0,maxi,m/2,0,0)+query(root[n],root[i],0,maxi,m/2,0,0)+d[i].b;
if(mon<=f) {printf("%lld",d[i].a);return 0;}
}
printf("-1");
return 0;
}