万红丛中一点绿
查看原帖
万红丛中一点绿
866613
sansesantongshun楼主2024/3/1 22:47
#include<bits/stdc++.h>
using namespace std;
int n,m,nm,b[100005],c[320],d[320],e[320],k,x,y,z,atp,btp,xx,yy,zz,l,mid,r,ans;
struct node
{
	int id,n;
} a[100005],aa[320],bb[320],o[320];
bool operator<(node x,node y)
{
	return x.n<y.n;
}
int read()
{
	int result=0,k=1;
	char ch=getchar();
	while (ch<'0' || ch>'9')
	{
		if (ch=='-')
		k=-1;
		ch=getchar();
	}
	while ('0'<=ch && ch<='9')
	{
		result=result*10+(ch^48);
		ch=getchar();
	}
	return k*result;
}
int doit(int l,int r,int x)
{
	int result=upper_bound(o+1,o+zz+1,(node){0,x})-o-1;
	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()
{
	n=read();
	m=read();
	nm=round(sqrt(n*30));
	for (int i=1;i<=n;++i)
	{
		a[i].id=i;
		a[i].n=read();
		b[i]=(i-1)/nm+1;
		if (c[b[i]]==0)
		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--)
	{
		k=read();
		x=read();
		y=read();
		z=read();
		if (k==1)
		{
			if (1<=z && z<=y-x+1)
			{
				atp=0;
				btp=0;
				xx=1;
				yy=1;
				zz=0;
				for (int i=c[b[x]];i<=d[b[x]];++i)
				if (x<=a[i].id && a[i].id<=y)
				{
					aa[++atp]=a[i];
					aa[atp].n+=e[b[x]];
				}
				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)
				{
					bb[++btp]=a[i];
					bb[btp].n+=e[b[y]];
				}
				while (xx<=atp && yy<=btp)
				if (aa[xx]<bb[yy])
				o[++zz]=aa[xx++];
				else
				o[++zz]=bb[yy++];
				while (xx<=atp)
				o[++zz]=aa[xx++];
				while (yy<=btp)
				o[++zz]=bb[yy++];
				l=o[1].n;
				r=o[zz].n;
				for (int i=b[x]+1;i<b[y];++i)
				{
					l=min(l,a[c[i]].n+e[b[i]]);
					r=max(r,a[d[i]].n+e[b[i]]);
				}
				ans=r;
				--r;
				while (l<=r)
				{
					mid=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
		{
			atp=0;
			btp=0;
			xx=1;
			yy=1;
			zz=c[b[x]];
			for (int i=c[b[x]];i<=d[b[x]];++i)
			if (x<=a[i].id && a[i].id<=y)
			{
				a[i].n+=z;
				aa[++atp]=a[i];
			}
			else
			bb[++btp]=a[i];
			while (xx<=atp && yy<=btp)
			if (aa[xx]<bb[yy])
			a[zz++]=aa[xx++];
			else
			a[zz++]=bb[yy++];
			while (xx<=atp)
			a[zz++]=aa[xx++];
			while (yy<=btp)
			a[zz++]=bb[yy++];
			if (b[x]<b[y])
			{
				atp=0;
				btp=0;
				xx=1;
				yy=1;
				zz=c[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;
					aa[++atp]=a[i];
				}
				else
				bb[++btp]=a[i];
				while (xx<=atp && yy<=btp)
				if (aa[xx]<bb[yy])
				a[zz++]=aa[xx++];
				else
				a[zz++]=bb[yy++];
				while (xx<=atp)
				a[zz++]=aa[xx++];
				while (yy<=btp)
				a[zz++]=bb[yy++];
				for (int i=b[x]+1;i<b[y];++i)
				e[i]+=z;
			}
		}
	}
}
2024/3/1 22:47
加载中...