mirror of
https://github.com/TheAlgorithms/C-Plus-Plus.git
synced 2026-04-13 17:50:45 +08:00
Added MO's algorithm
This commit is contained in:
75
Range queries/MO.cpp
Normal file
75
Range queries/MO.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
#include "bits/stdc++.h"
|
||||
using namespace std;
|
||||
const int N = 1e6+5;
|
||||
int a[N],bucket[N],cnt[N];
|
||||
int bucket_size;
|
||||
struct query{
|
||||
int l,r,i;
|
||||
}q[N];
|
||||
int ans=0;
|
||||
|
||||
void add(int index)
|
||||
{
|
||||
cnt[a[index]]++;
|
||||
if(cnt[a[index]] == 1)
|
||||
ans++;
|
||||
}
|
||||
void remove(int index)
|
||||
{
|
||||
cnt[a[index]]--;
|
||||
if(cnt[a[index]] == 0)
|
||||
ans--;
|
||||
}
|
||||
|
||||
|
||||
bool mycmp(query x, query y)
|
||||
{
|
||||
if(x.l/bucket_size != y.l/bucket_size)
|
||||
return x.l/bucket_size < y.l/bucket_size;
|
||||
return x.r<y.r;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int n,t,i,j,k=0;
|
||||
scanf("%d",&n);
|
||||
for(i=0;i<n;i++)
|
||||
scanf("%d",&a[i]);
|
||||
bucket_size = ceil(sqrt(n));
|
||||
scanf("%d",&t);
|
||||
for(i=0;i<t;i++)
|
||||
{
|
||||
scanf("%d %d",&q[i].l,&q[i].r);
|
||||
q[i].l--; q[i].r--;
|
||||
q[i].i = i;
|
||||
}
|
||||
sort(q,q+t,mycmp);
|
||||
int left=0,right=0;
|
||||
for(i=0;i<t;i++)
|
||||
{
|
||||
int L=q[i].l, R=q[i].r;
|
||||
while(left < L)
|
||||
{
|
||||
remove(left);
|
||||
left++;
|
||||
}
|
||||
while(left>L)
|
||||
{
|
||||
add(left-1);
|
||||
left--;
|
||||
}
|
||||
while(right<=R)
|
||||
{
|
||||
add(right);
|
||||
right++;
|
||||
}
|
||||
while(right>R+1)
|
||||
{
|
||||
remove(right-1);
|
||||
right--;
|
||||
}
|
||||
bucket[q[i].i] = ans;
|
||||
}
|
||||
for(i=0;i<t;i++)
|
||||
printf("%d\n",bucket[i]);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user