#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxl 50010
using namespace std;
int n,m,size,cnt,tot;
int a[maxl],pos[maxl],l[maxl],r[maxl],cntl[maxl],cntr[maxl];
struct que
{
int l,r,f,ind;
}q[maxl<<2];
long long ans[maxl];
bool cmp(const que &x,const que &y)
{
if(pos[x.l]==pos[y.l])
return x.r<y.r;
else
return pos[x.l]<pos[y.l];
}
void prework()
{
size=sqrt(n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
cnt=n/size;
if(n%size)
cnt++;
for(int i=1;i<=cnt;i++)
{
l[i]=(i-1)*size+1;r[i]=min(i*size,n);
for(int j=l[i];j<=r[i];j++)
pos[j]=i;
}
int l1,r1,l2,r2;
scanf("%d",&m);
tot=0;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
q[++tot].l=r1;q[tot].r=r2;q[tot].ind=i;q[tot].f=1;
q[++tot].l=l1-1;q[tot].r=r2;q[tot].ind=i;q[tot].f=-1;
q[++tot].l=l2-1;q[tot].r=r1;q[tot].ind=i;q[tot].f=-1;
q[++tot].l=l1-1;q[tot].r=l2-1;q[tot].ind=i;q[tot].f=1;
}
sort(q+1,q+1+tot,cmp);
}
void mainwork()
{
int left=0,right=0;
long long res=0;
memset(ans,0,sizeof(ans));
memset(cntl,0,sizeof(cntl));
memset(cntr,0,sizeof(cntr));
for(int i=1;i<=tot;i++)
{
while(left<q[i].l)
{
left++;res+=cntr[a[left]];
cntl[a[left]]++;
}
while(left>q[i].l)
{
res-=cntr[a[left]];
cntl[a[left]]--;left--;
}
while(right<q[i].r)
{
right++;res+=cntl[a[right]];
cntr[a[right]]++;
}
while(right>q[i].r)
{
res-=cntl[a[right]];
cntr[a[right]]--;right--;
}
ans[q[i].ind]+=q[i].f*res;
}
}
void print()
{
for(int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
}
int main()
{
while(~scanf("%d",&n))
{
prework();
mainwork();
print();
}
return 0;
}
BZOJ5016
最新推荐文章于 2023-03-31 23:33:24 发布