1
2 #include <cstdio>
3 #include <iostream>
4 #include <cstring>
5 #include <algorithm>
6 #include <queue>
7 #include <vector>
8 #include <cmath>
9 #define pa pair<int,int>
10 #define mp make_pair
11 #define fi first
12 #define se second
13 #define pb push_back
14 using namespace std;
15 inline void Get_Int(int &x)
16 {
17     x=0;  char ch=getchar(); int f=1;
18     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
19     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} x*=f;
20 }
21 inline void Put_Int(int x)
22 {
23     char ch[20]; int top=0;
24     if (x==0) ch[++top]='0';
25     while (x) ch[++top]=x%10+'0',x/=10;
26     while (top) putchar(ch[top--]); putchar('\n');
27 }
28 //===================================================
29 const int Maxn=101000;
30 const int Maxm=1010000;
31 struct Node{int l,r,u,v,id;}q[Maxm];
32
33 int n,m,s[Maxn],Block,Ans[Maxm],b[Maxn],B[Maxn];//Ans开Maxm
34 inline int Get(int x) {return (x-1)/Block+1;}
35 inline int Query(int x,int y)
36 {
37     int l=Get(x),r=Get(y),ret=0;
38     if (l==r)
39     {
40         for (int i=x;i<=y;i++) if (b[i]) ret++;
41         return ret;
42     }
43     for (int i=l+1;i<r;i++) ret+=B[i];
44     for (int i=x;Get(i)==l;i++) if (b[i]) ret++;
45     for (int i=y;Get(i)==r;i--) if (b[i]) ret++;
46     return ret;
47 }
48 inline bool cmp(Node A,Node B)
49 {
50     if (Get(A.l)==Get(B.l)) return A.r<B.r;
51     return Get(A.l)<Get(B.l);
52 }
53 inline void Del(int x)
54 {if (b[s[x]]==1) B[Get(s[x])]--; b[s[x]]--;}
56 {if (b[s[x]]==0) B[Get(s[x])]++; b[s[x]]++;}
57
58 int main()
59 {
60     Get_Int(n),Get_Int(m); Block=(int)sqrt(n);
61     for (int i=1;i<=n;i++) Get_Int(s[i]);
62     for (int i=1;i<=m;i++)
63         Get_Int(q[i].l),Get_Int(q[i].r),Get_Int(q[i].u),Get_Int(q[i].v),q[i].id=i;
64     memset(b,0,sizeof(b));
65     memset(B,0,sizeof(B));
66     sort(q+1,q+m+1,cmp);
67     int L=1,R=0;
68
69     for (int i=1;i<=m;i++)
70     {
73         while (L<q[i].l) Del(L),L++;
74         while (R>q[i].r) Del(R),R--;
75         Ans[q[i].id]=Query(q[i].u,q[i].v);
76     }
77     for (int i=1;i<=m;i++) Put_Int(Ans[i]);
78     return 0;
79 }

 1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4 #include <algorithm>
5 #include <queue>
6 #include <vector>
7 #include <cmath>
8 #define pa pair<int,int>
9 #define mp make_pair
10 #define fi first
11 #define se second
12 #define pb push_back
13 using namespace std;
14 inline void Get_Int(int &x)
15 {
16     x=0;  char ch=getchar(); int f=1;
17     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
18     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} x*=f;
19 }
20 inline void Put_Int(int x)
21 {
22     char ch[20]; int top=0;
23     if (x==0) ch[++top]='0';
24     while (x) ch[++top]=x%10+'0',x/=10;
25     while (top) putchar(ch[top--]); putchar('\n');
26 }
27 //===================================================
28 const int Maxn=101000;
29 const int Maxm=1010000;
30 struct Node{int l,r,u,v,id;}q[Maxm];
31
32 int c[Maxn],n,m,s[Maxn],Block,Ans[Maxm],b[Maxn];//Ans开Maxm
33 inline int lowbit(int x) {return x&(-x);}
34 inline int Query(int x)
35 {int ret=0; for (int i=x;i;i-=lowbit(i)) ret+=c[i];return ret;}
36 inline void Modify(int x,int v)
37 {for (int i=x;i<=n;i+=lowbit(i)) c[i]+=v;}
38 inline int Get(int x) {return (x-1)/Block+1;}
39 inline bool cmp(Node A,Node B)
40 {
41     if (Get(A.l)==Get(B.l)) return A.r<B.r;
42     return Get(A.l)<Get(B.l);
43 }
44 inline void Del(int x)
45 {if (b[s[x]]==1) Modify(s[x],-1);b[s[x]]--;}
47 {if (b[s[x]]==0) Modify(s[x],1); b[s[x]]++;}
48
49 int main()
50 {
51     Get_Int(n),Get_Int(m); Block=(int)sqrt(n/2);
52     for (int i=1;i<=n;i++) Get_Int(s[i]);
53     for (int i=1;i<=m;i++)
54         Get_Int(q[i].l),Get_Int(q[i].r),Get_Int(q[i].u),Get_Int(q[i].v),q[i].id=i;
55     memset(b,0,sizeof(b));
56     memset(c,0,sizeof(c));
57     sort(q+1,q+m+1,cmp);
58     int L=1,R=0;
59     for (int i=1;i<=m;i++)
60     {
69 }