T飞求助
查看原帖
T飞求助
866613
sansesantongshun楼主2024/1/28 14:07

24pts

#include<bits/stdc++.h>
using namespace std;
int n,m,nm,b[100005],c[320],d[320],e[320],k,x,y,z,l,mid,r,ans;
struct node
{
	int id,n;
} a[100005];
bool operator<(node x,node y)
{
	return x.n<y.n;
}
int doit(int l,int r,int x)
{
	int result=0;
	for (int i=c[b[l]];i<=d[b[l]];++i)
	if (l<=a[i].id && a[i].id<=r && a[i].n+e[b[i]]<=x)
	++result;
	if (b[l]<b[r])
	{
		for (int i=c[b[r]];i<=d[b[r]];++i)
		if (l<=a[i].id && a[i].id<=r && a[i].n+e[b[i]]<=x)
		++result;
		for (int i=b[l]+1;i<b[r];++i)
		result+=upper_bound(a+c[i],a+d[i]+1,(node){0,x-e[i]})-a-c[i];
	}
	return result;
}
int main()
{
	cin>>n>>m;
	nm=round(sqrt(n));
	for (int i=1;i<=n;++i)
	{
		a[i].id=i;
		scanf("%d",&a[i].n);
		b[i]=(i-1)/nm+1;
		if (b[i]!=b[i-1])
		c[b[i]]=i;
		d[b[i]]=i;
	}
	for (int i=1;i<=b[n];++i)
	sort(a+c[i],a+d[i]+1);
	while (m--)
	{
		scanf("%d%d%d%d",&k,&x,&y,&z);
		if (k==1)
		{
			if (1<=k && k<=y-x+1)
			{
				l=0x7fffffff;
				r=-0x80000000;
				for (int i=c[b[x]];i<=d[b[x]];++i)
				if (x<=a[i].id && a[i].id<=y)
				{
					l=min(l,a[i].n+e[b[i]]);
					r=max(r,a[i].n+e[b[i]]);
				}
				if (b[x]<b[y])
				{
					for (int i=c[b[y]];i<=d[b[y]];++i)
					if (x<=a[i].id && a[i].id<=y)
					{
						l=min(l,a[i].n+e[b[i]]);
						r=max(r,a[i].n+e[b[i]]);
					}
					for (int i=b[x]+1;i<b[y];++i)
					{
						l=min(l,a[c[i]].n+e[i]);
						r=max(r,a[d[i]].n+e[i]);
					}
				}
				ans=r;
				while (l<=r)
				{
					mid=(long long)l+r>>1;
					if (doit(x,y,mid)>=z)
					{
						ans=mid;
						r=mid-1;
					}
					else
					l=mid+1;
				}
				cout<<ans<<'\n';
			}
			else
			cout<<"-1\n";
		}
		else
		{
			for (int i=c[b[x]];i<=d[b[x]];++i)
			if (x<=a[i].id && a[i].id<=y)
			a[i].n+=z;
			sort(a+c[b[x]],a+d[b[x]]+1);
			if (b[x]<b[y])
			{
				for (int i=c[b[y]];i<=d[b[y]];++i)
				if (x<=a[i].id && a[i].id<=y)
				a[i].n+=z;
				sort(a+c[b[y]],a+d[b[y]]+1);
				for (int i=b[x]+1;i<b[y];++i)
				e[i]+=z;
			}
		}
	}
}
2024/1/28 14:07
加载中...