求助线段树
查看原帖
求助线段树
160839
Prean楼主2020/8/1 18:25

线段树太毒瘤了,这起码调了一个月

有人能康康吗/kel

#include<algorithm>
#include<cstdio>
const int M=5e4+5;
typedef long long ll;
struct Node{
	int L,R;
	ll val,lazy;
}t[M*200];
int n,m,tot,len,lsh[M],root[M<<2];
struct ASK{
	int opt,L,R;
	ll val;
}q[M];
inline int min(const int&a,const int&b){
	return a>b?b:a;
}
inline int max(const int&a,const int&b){
	return a>b?a:b;
}
void change(int&u,int l,int r,int L=1,int R=n){
	if(L>r||R<l)return;
	if(!u)u=++tot;
	t[u].val+=min(R,r)-max(L,l)+1;
	if(l<=L&&r>=R)return void(++t[u].lazy);
	if(L<R){
		int mid=L+R>>1;
		change(t[u].L,l,r,L,mid);
		change(t[u].R,l,r,mid+1,R);
	}
}
ll query(int u,int l,int r,int L=1,int R=n,ll add=0){
	if(L>r||R<l)return 0;
	if(!u)return add*(R-L+1);
	if(l<=L&&r>=R)return t[u].val+add*(R-L+1);
	if(L<R){
		int mid=L+R>>1;
		return query(t[u].L,l,r,L,mid,add+t[u].lazy)+query(t[u].R,l,r,mid+1,R,add+t[u].lazy);
	}
}
void Change(int u,int l,int r,int x,int L=1,int R=len){
	change(root[u],l,r);
	if(L<R){
		int mid=L+R>>1;
		if(x<=mid)Change(u<<1,l,r,x,L,mid);
		else Change(u<<1|1,l,r,x,mid+1,R);
	}
}
int Query(int u,int l,int r,ll k,int L=1,int R=len){
	if(L==R)return L;
	ll sum=query(root[u<<1|1],l,r);
	int mid=L+R>>1;
	if(k>sum)return Query(u<<1,l,r,k-sum,L,mid);
	else return Query(u<<1|1,l,r,k,mid+1,R);
}
signed main(){
	int i;
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;++i){
		scanf("%d%d%d%lld",&q[i].opt,&q[i].L,&q[i].R,&q[i].val);
		if(q[i].opt==1)lsh[++len]=q[i].val;
	}
	std::sort(lsh+1,lsh+len+1);
	len=std::unique(lsh+1,lsh+len+1)-lsh-1;
	for(i=1;i<=m;++i){
		if(q[i].opt==1){
			q[i].val=std::lower_bound(lsh+1,lsh+len+1,q[i].val)-lsh;
			Change(1,q[i].L,q[i].R,q[i].val);
		}
		else{
			printf("%d\n",lsh[Query(1,q[i].L,q[i].R,q[i].val)]);
		}
	}
}
2020/8/1 18:25
加载中...