主席树只过样例求调教
查看原帖
主席树只过样例求调教
754502
_AyachiNene楼主2024/3/5 16:16
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int res=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
	return res*f;
}
void write(int x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
//-------SegmentTreeBegin-------
namespace Elaina
{
	struct node
	{
		int l,r,val,cnt;
	}t[114514<<5];
	int cnt,rt[114514];
	int bld(int l,int r,int root)
	{
		root=++cnt;
		if(l==r) return root;
		int mid=l+r>>1;
		t[root].l=bld(l,mid,t[root].l);
		t[root].r=bld(mid+1,r,t[root].r);
		return root;
	}
	int insert(int x,int l,int r,int root,int v)
	{
		int cur=++cnt;
		t[cur]=t[root];
		if(l==r)
		{
			t[cur].val+=v*l;
			t[cur].cnt+=v;
			return cur;
		}
		int mid=l+r>>1;
		if(x<=mid) t[cur].l=insert(x,l,mid,t[cur].l,v);
		else t[cur].r=insert(x,mid+1,r,t[cur].r,v);
		t[cur].val=t[t[cur].l].val+t[t[cur].r].val;
		t[cur].cnt=t[t[cur].l].cnt+t[t[cur].r].cnt;
		return cur;
	}
	int query(int l,int r,int root,int k)
	{
		if(l==r) return k*l;
		int mid=l+r>>1;
		if(t[t[root].l].cnt<k)
			return t[t[root].l].val+query(mid+1,r,t[root].r,k-t[t[root].l].cnt);
		return query(l,mid,t[root].l,k);
	}
}
#define rt Elaina::rt
#define bld Elaina::bld
#define insert Elaina::insert
#define query Elaina::query
#define t Elaina::t
//--------SegmentTreeEnd--------
struct node
{
	int d,p,l;
}a[114514<<1];
bool cmp(node x,node y)
{
	return x.d<y.d;
}
int n,m;
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i].d=read(),a[i].p=read(),a[i].l=read();
	rt[100001]=bld(1,1e5,rt[100001]);
	sort(a+1,a+n+1,cmp);
	int cur=n;
	for(int i=1e5;i>=1;i--)
	{
		rt[i]=rt[i+1];
		while(a[cur].d>=i&&cur>=1)
		{
			rt[i]=insert(a[cur].p,1,1e5,rt[i+1],a[cur].l);
			--cur;
		}
	}
	for(int i=1;i<=m;i++)
	{
		int x=read(),y=read();
		int l=1,r=1e5,ans=-1;
		if(t[rt[1]].cnt<y)
		{
			puts("-1");
			continue;
		}
		while(l<=r)
		{
			int mid=l+r>>1;
			if(query(1,1e5,rt[mid],y)<=x)
				ans=mid,l=mid+1;
			else r=mid-1;
		}
		write(ans),puts("");
	}
}
2024/3/5 16:16
加载中...