题目

You are given an array with n integers a1, a2, ..., an, and q queries to answer.

Each query consists of four integers l1, r1, l2 and r2. Your task is to count the number of pairs of indices (i, j) satisfying the following conditions:

ai = aj

l1 ≤ i ≤ r1

l2 ≤ j ≤ r2

Input

The first line of the input contains an integer n (1 ≤ n ≤ 50 000) — the size of the given array.

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ n).

The third line contains an integer q (1 ≤ q ≤ 50 000) — the number of queries.

Each of the next q lines contains four integers l1, r1, l2, r2 (1 ≤ l1 ≤ r1 ≤ n, 1 ≤ l2 ≤ r2 ≤ n), describing one query.

Output

For each query count the number of sought pairs of indices (i, j) and print it in a separate line.

Examples

Input

7

1 5 2 1 7 2 2

8

1 3 4 5

2 3 5 7

1 4 3 7

2 6 4 7

1 6 2 5

3 3 6 7

4 5 1 4

2 3 4 5

Output

1

2

5

6

6

2

2

0

题目:

您将获得一个包含n个整数a1,a2,...,an和q查询的数组。

每个查询由四个整数l1,r1,l2和r2组成。您的任务是计算满足以下条件的索引对(i,j)的数量:

$ a_i = a_j $

L1 ≤ i ≤ R1

L2 ≤ j ≤ R2

输入

输入的第一行包含一个整数n(1≤N≤50 000) -给定阵列的大小。

第二行包含n个整数a1,a2,...,a(1≤ai≤n)。

第三行包含一个整数q(1≤q≤50000) - 查询数。

接下来的q行中的每一行包含四个整数l1,r1,l2,r2(1≤l1≤r1≤n,1≤l2≤r2≤n),描述一个查询。

输出

对于每个查询计数所寻求的索引对(i,j)的数量,并将其打印在单独的行中。

示例输入

7
1 5 2 1 7 2 2
8
1 3 4 5
2 3 5 7
1 4 3 7
2 6 4 7
1 6 2 5
3 3 6 7
4 5 1 4
2 3 4 5

示例输出

1
2
5
6
6
2
2
0

仔细观察题目我们不难发现这题我们需要维护两个区间内元素的出现次数

嗯?这不是裸裸的莫队吗?等等,两个\(50000\)的区间,我不敲时谁敲时?

这谁做得出啊??干脆维护一个区间算了,暴力枚举第二个区间算了!!

于是某年某月某日某蒟蒻以2000毫秒的好成绩卡了过去:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define db double
#define inf 0x7fffffff
#define rg register int using namespace std; struct su{
int l,r,ll,rr,t;
}k[50001]; long long now;
int z[50001];
int s[50001];
int tot[50001];
int tot2[50001];
long long ans[50001];
int n,m,q,f,l=1,r,ll=1,rr; inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
} inline bool cmp(su x,su y){
return z[x.l]==z[y.l]?x.r<y.r:x.l<y.l;
} inline void add(int x,int y){
now-=(long long)tot2[x]*tot[x];
tot[x]+=y;
now+=(long long)tot2[x]*tot[x];
} inline void add2(int x,int y){
now-=(long long)tot[x]*tot2[x];
tot2[x]+=y;
now+=(long long)tot[x]*tot2[x];
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr();
f=sqrt(n-1)+1;
for(rg i=1;i<=n;++i) s[i]=qr();
for(rg i=1,j=1;i<=n;++i)
z[i]=i%f==0?j++:j;
m=qr();
for(rg i=1;i<=m;++i){
k[i].l=qr();
k[i].r=qr();
k[i].ll=qr();
k[i].rr=qr();
k[i].t=i;
}
sort(k+1,k+m+1,cmp);
for(rg i=1;i<=m;++i){
while(l<k[i].l)add(s[l],-1),++l;
while(k[i].l<l)add(s[l-1],1),--l;
while(r<k[i].r)add(s[r+1],1),++r;
while(k[i].r<r)add(s[r],-1),--r;
while(ll<k[i].ll)add2(s[ll],-1),++ll;
while(k[i].ll<ll)add2(s[ll-1],1),--ll;
while(rr<k[i].rr)add2(s[rr+1],1),++rr;
while(k[i].rr<rr)add2(s[rr],-1),--rr;
ans[k[i].t]=now;
}
for(rg i=1;i<=m;++i)
printf("%lld\n",ans[i]);
return 0;
}

Strange Queries(莫队)的更多相关文章

  1. CFGym101138D Strange Queries 莫队/分块

    正解:莫队/分块 解题报告: 传送门 ummm这题耗了我一天差不多然后我到现在还没做完:D 而同机房的大佬用了一个小时没有就切了?大概这就是大佬和弱鸡的差距趴QAQ 然后只是大概写下思想好了因为代码我 ...

  2. XOR Queries(莫队+trie)

    题目链接: XOR Queries 给出一个长度为nn的数组CC,回答mm个形式为(L, R, A, B)(L,R,A,B)的询问,含义为存在多少个不同的数组下标k \in [L, R]k∈[L,R] ...

  3. Sona && Little Elephant and Array && Little Elephant and Array && D-query && Powerful array && Fast Queries (莫队)

    vjudge上莫队专题 真的是要吐槽自己(自己的莫队手残写了2个bug) s=sqrt(n) 是元素的个数而不是询问的个数(之所以是sqrt(n)使得左端点每个块左端点的范围嘴都是sqrt(n)) 在 ...

  4. CodeForces 375D Tree and Queries 莫队||DFS序

    Tree and Queries 题意:有一颗以1号节点为根的树,每一个节点有一个自己的颜色,求出节点v的子数上颜色出现次数>=k的颜色种类. 题解:使用莫队处理这个问题,将树转变成DFS序区间 ...

  5. cf375D. Tree and Queries(莫队)

    题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...

  6. [Codeforces375D]Tree and Queries(莫队算法)

    题意:给定一棵树,每个节点有颜色,对于每个询问(u,k)询问以u为根节点的子树下有多少种颜色出现次数>=k 因为是子树,跟dfs序有关,转化为一段区间,可以用莫队算法求解 直接用一个数组统计出现 ...

  7. Gym101138D Strange Queries/BZOJ5016 SNOI2017 一个简单的询问 莫队、前缀和、容斥

    传送门--Gym 传送门--BZOJ THUWC2019D1T1撞题可还行 以前有些人做过还问过我,但是我没有珍惜,直到进入考场才追悔莫及-- 设\(que_{i,j}\)表示询问\((1,i,1,j ...

  8. LightOJ 1188 Fast Queries(简单莫队)

    1188 - Fast Queries    PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 64 MB Gi ...

  9. CodeForces 376F Tree and Queries(假·树上莫队)

    You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. We will ass ...

随机推荐

  1. RN热更新

    说白了集成RN业务,就是集成RN离线包,解析并渲染.所以,RN热更新的根本原理就是更换js bundle文件和资源文件,并重新加载,新的内容就完美的展示出来了. 目前市场上出现的3种热更新模式如下:仅 ...

  2. Software-Defined Networking:A Comprehensive Survey--Day2

    Software-Defined Networking:A Comprehensive Survey (续+1s) IV. SOFTWARE-DEFINED NETWORKS: BOTTOM-UP S ...

  3. Jquery Cookie操作

    // 写入 $.cookie('the_cookie','the_value');// 读取 $.cookie('the_cookie');// 删除 $.cookie('the_cookie',nu ...

  4. SpringBoot 2.SpringBoot整合Mybatis

    一.创建Springboot的配置文件:application.properties,并添加MyBatis依赖 SpringApplication 会从 application.properties  ...

  5. jmeter正则提取值 同级目录下的值

    https://www.v2ex.com/api/nodes/show.json?name=python 接口返回: { "avatar_large": "//cdn.v ...

  6. java学习三 小数默认为double

    前++,后++在独立运算时候 直接计算出值 当后加加和减减和其他代码在一行的时候先使用加加和减减之前的值, 如果不在同一行,后面的一行就会得到加加或减减后的值 &&是逻辑运算符,逻辑运 ...

  7. BZOJ4589 Hard Nim(博弈+FWT)

    即使n个数的异或为0.如果只有两堆,将质数筛出来设为1,做一个异或卷积即可.显然这个东西满足结合律,多堆时直接快速幂.可以在点值表示下进行. #include<iostream> #inc ...

  8. 【题解】 [HNOI2002]营业额统计 (Splay)

    懒得复制,戳我戳我 Solution: \(Splay\)板子题,注意可以选择相等大小 Code: //It is coded by Ning_Mew on 4.10 #include<bits ...

  9. BZOJ 2480 && 3239 && 2995 高次不定方程(高次同余方程)

    链接 BZOJ 2480 虽然是个三倍经验题(2333),但是只有上面这道(BZOJ2480)有 p = 1 的加强数据,推荐大家做这道. 题解 这是一道BSGS(Baby Step Giant St ...

  10. zabbix使用percona插件监控mysql

    1.添加percona仓库. # yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-4/percon ...