DQUERY - D-query - SPOJ Solution C++

  Problem Link : DQUERY 


👉 Hint : Sort with custom comparator

 


✅ C++ Solution :

 
#include<bits/stdc++.h>
using namespace std;

int blk_size;

struct query
{
    int lt,rt,ind;
};

bool comp(query x,query y)
{
	if(x.lt/blk_size != y.lt/blk_size)
		return x.lt/blk_size < y.lt/blk_size;
	return x.rt<y.rt;
}

int main()
{
	int n,q,l,m;
	scanf("%d",&n);
	blk_size=sqrt(n);
	int arr[n],cnt[1001010],qans=0;
	for(int i=0;i<n;i++)
		scanf("%d",&arr[i]);
	memset(cnt,0,sizeof(cnt));

	scanf("%d",&q);
	query v[q];
	int ans[q];
	for(int i=0;i<q;i++)
	{
	    scanf("%d %d",&l,&m);
		v[i].lt=l-1;
		v[i].rt=m-1;
		v[i].ind=i;
	}
	sort(v,v+q,comp);
	int mo_l=0;
	int mo_r=-1;
	int curr_l;
	int curr_r;
	for(int i=0;i<q;i++)
	{
		curr_l=v[i].lt;
		curr_r=v[i].rt;

		while(mo_r < curr_r)
		{
			++mo_r;
			cnt[arr[mo_r]]++;
			if(cnt[arr[mo_r]]==1)
				qans++;
		}
		while(mo_r >curr_r)
		{
			cnt[arr[mo_r]]--;
			if(cnt[arr[mo_r]]==0)
				qans--;
			mo_r--;
		}
		while(mo_l > curr_l)
		{
			--mo_l;
			cnt[arr[mo_l]]++;
			if(cnt[arr[mo_l]]==1)
				qans++;

		}
		while(mo_l < curr_l)
		{
			cnt[arr[mo_l]]--;
			if(cnt[arr[mo_l]]==0)
				qans--;
			mo_l++;
		}
		ans[v[i].ind]=qans;

	}

	for(int i=0;i<q;i++)
		printf("%d\n",ans[i]);

}

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!