记录编号 549293 评测结果 EEEEEEE
题目名称 3347.有限制区间元素询问I 最终得分 0
用户昵称 瑆の時間~無盡輪迴·林蔭 是否通过 未通过
代码语言 C++ 运行时间 7.905 s
提交时间 2020-02-09 18:00:30 内存使用 1190.11 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm> 
using namespace std;
int V[200001],a[200001];
int sum[102400001],root[800001],ch[102400001][2];
int n,tn,m,tot,a1,a2,a3,a4,mi,mx;
bool Function(int x,int y)
{
	return x<y;
}
void LSH()
{
	sort(a+1,a+1+tn,Function);
	n=unique(a+1,a+1+tn)-a-1;
}
void build(int x,int l,int r)
{
	if(l==r)
	{
		sum[x]=0;
		return ;
	}
	ch[x][0]=++tot;
	ch[x][1]=++tot;
	//if(tot%1000==0)
		//cout<<tot/1000<<' ';
	int mid=(l+r)>>1;
	build(ch[x][0],l,mid);
	build(ch[x][1],mid+1,r);
}
void Fir_build(int x,int l,int r)
{
	root[x]=++tot;
	//if(tot%1000==0)
		//cout<<tot/1000<<' ';
	build(root[x],1,n);
	if(l==r)
		return;
	int mid=(l+r)>>1;
	Fir_build(x<<1,l,mid);
	Fir_build(x<<1|1,mid+1,r);
}
void pushup(int x)
{
	sum[x]=sum[ch[x][0]]+sum[ch[x][1]]; 
}
void ADD(int x,int l,int r,int K,int V)
{
	if(l==r)
	{
		sum[x]+=V;
		return;
	}
	int mid=(l+r)>>1;
	if(mid>=K)
		ADD(ch[x][0],l,mid,K,V);
	else
		ADD(ch[x][1],mid+1,r,K,V);
	pushup(x);
}
void Fir_ADD(int x,int l,int r,int ID,int K,int V)
{
	ADD(root[x],1,n,K,V);
	if(l==r)
		return;
	int mid=(l+r)>>1;
	if(ID<=mid)
		Fir_ADD(x<<1,l,mid,ID,K,V);
	else
		Fir_ADD(x<<1|1,mid+1,r,ID,K,V); 
}
int Query(int x,int l,int r,int nl,int nr)
{
	if(nl<=l&&nr>=r)
		return sum[x];
	int mid=(l+r)>>1,res=0;
	if(nl<=mid)
	{
		res+=Query(ch[x][0],l,mid,nl,nr);
	}
	if(nr>mid)
		res+=Query(ch[x][1],mid+1,r,nl,nr);
	return res;
}
int Fir_Query(int x,int l,int r,int nl,int nr,int Vl,int Vr)
{
	if(nl<=l&&nr>=r)
	{
		return Query(root[x],1,n,Vl,Vr);
	}
	int mid=(l+r)>>1,res=0;
	if(nl<=mid)
		res+=Fir_Query(x<<1,l,mid,nl,nr,Vl,Vr);
	if(nr>mid)
		res+=Fir_Query(x<<1|1,mid+1,r,nl,nr,Vl,Vr);
	return res;	
}
int main()
{
	freopen("LBEQ-I.in","r",stdin);
	freopen("LBEQ-I.out","w",stdout);
	scanf("%d%d",&tn,&m);
	mi=998244353;
	for(int i=1;i<=tn;i++)
	{
		scanf("%d",&a[i]);
		V[i]=a[i];
		mi=min(mi,a[i]);
		mx=max(mx,a[i]);
	}
	LSH();
	Fir_build(1,1,tn);
	for(int i=1;i<=tn;i++)
	{
		int K1=lower_bound(a+1,a+n+1,V[i])-a;
		Fir_ADD(1,1,tn,i,K1,V[i]);
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d%d",&a1,&a2,&a3,&a4);
		int K1=lower_bound(a+1,a+1+n,a3)-a;
		int K2=upper_bound(a+1,a+1+n,a4)-a;
		K2--;
		if(a3>mx||a4<mi)
		{
			cout<<0<<endl;
			continue;
		}
		cout<<Fir_Query(1,1,tn,a1,a2,K1,K2)<<endl;
	}
	return 0;
}