18pts,ac#11#13#1,悬棺求调
查看原帖
18pts,ac#11#13#1,悬棺求调
767042
Smart_Jason楼主2024/12/18 14:40

马蜂清奇,见谅

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long 
int n,m,f[500005],tot;
ll ans[500005],v[500005];
struct node{
	int op,l,r,id;
	ll c;
}o[500005],o2[500005],o3[500005];
bool cmp(int x,int y){ return x>y; }
int tr[2000005],lz[2000005];
void change(int ct,int l,int r,int ml,int mr,int val){
	if(l>r||ml>mr) return;
	if(l>=ml&&r<=mr){
		tr[ct]+=(r-l+1)*val,lz[ct]+=val;
		return;
	}
	int mid=(l+r)>>1;
	if(ml<=mid) change(ct<<1,l,mid,ml,mr,val);
	if(mr>=mid+1) change(ct<<1|1,mid+1,r,ml,mr,val);
	tr[ct]=tr[ct<<1]+tr[ct<<1|1];
}
int ask(int ct,int l,int r,int ml,int mr){
	if(l>r||ml>mr) return 0;
	if(l>=ml&&r<=mr) return tr[ct];
	int rt=0;
	int mid=(l+r)>>1;
	if(lz[ct]!=0){
		tr[ct<<1]+=(mid-l+1)*lz[ct],tr[ct<<1|1]+=(r-mid)*lz[ct];
		lz[ct<<1]+=lz[ct],lz[ct<<1|1]+=lz[ct];
		lz[ct]=0;
	}
	if(ml<=mid) rt+=ask(ct<<1,l,mid,ml,mr);
	if(mr>=mid+1) rt+=ask(ct<<1|1,mid+1,r,ml,mr);
	tr[ct]=tr[ct<<1]+tr[ct<<1|1];
	return rt;
}
void work(int l1,int r1,int l2,int r2){
	if(l1>r1||l2>r2) return;
	int mid=(l2+r2)>>1,cnt1=0,cnt2=0;
	for(int i=l1;i<=r1;i++){
		if(o[i].op==1){
			if(o[i].c>=v[mid]) change(1,1,n,o[i].l,o[i].r,1),o2[++cnt1]=o[i];
			else o3[++cnt2]=o[i];
		}else{
			if(ask(1,1,n,o[i].l,o[i].r)>=o[i].c) o2[++cnt1]=o[i];
			else o[i].c-=ask(1,1,n,o[i].l,o[i].r),o3[++cnt2]=o[i];
		}
	}
	int ct=0;
	for(int i=l1;i<l1+cnt1;i++) o[i]=o2[++ct];
	ct=0;
	for(int i=l1+cnt1;i<=r1;i++) o[i]=o3[++ct];
	for(int i=l1;i<l1+cnt1;i++) if(o[i].op==1) change(1,1,n,o[i].l,o[i].r,-1);
	for(int i=l1;i<l1+cnt1;i++) if(o[i].op==2) ans[o[i].id]=v[mid];
	work(l1+cnt1,r1,mid+1,r2);
	work(l1,l1+cnt1-1,l2,mid-1);
}
bool cmp2(node x,node y){ return x.id<y.id; }
signed main(){
//	freopen("a.txt","r",stdin);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%lld%lld%lld%lld",&o[i].op,&o[i].l,&o[i].r,&o[i].c);
		if(o[i].op==1) v[++v[0]]=o[i].c;
		o[i].id=i;
	}
	sort(v+1,v+v[0]+1,cmp);
	for(int i=1;i<=v[0];i++) if(i==1||v[i]!=v[tot]) v[++tot]=v[i];
	work(1,m,1,tot);
	sort(o+1,o+m+1,cmp2);
	for(int i=1;i<=m;i++) if(o[i].op==2) printf("%lld\n",ans[i]);
}
2024/12/18 14:40
加载中...