anudeep2011/programming

Code optimized for memory constraint

imbipulkumar opened this issue · 0 comments

Following code is optimized for memory constraint.
Occupies 1/2 less memory space than the original code.
No hard-coded Block.

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

int arr[30001],frq[1000001],sqBlk,dC;

struct Query {
	int L,R,ind;
};

bool cmp(Query x,Query y)
{
	int a=x.L/sqBlk,b=y.L/sqBlk;
	if(a!=b)
	{
		return a<b;
	}
	else
	{
		return x.R<y.R;
	}
}

void add(int indx)
{
    ++frq[arr[indx]];
    if(frq[arr[indx]]==1)
    {
      ++dC;
    }
}

void remove(int indx)
{
    --frq[arr[indx]];
    if(frq[arr[indx]]==0)
    {
      --dC;
    }
}

int main() {
	int n,nq;
	scanf("%d",&n);
	sqBlk=round(sqrt(n));
	for(int i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	scanf("%d",&nq);
	int ans[nq];
	Query q[nq];
	for(int i=0;i<nq;i++)
	{
		scanf("%d%d",&q[i].L,&q[i].R);
		q[i].ind=i;
		--q[i].L;
		--q[i].R;
	}
	sort(q,q+nq,cmp);
	int curL=q[0].L,curR=q[0].R;
	for(int i=0;i<nq;i++)
	{
	    if(i==0)
	    {
	        int temp=curL;
	        while(temp<=curR)
	        {
	            add(temp);
	            ++temp;
	        }
	        ans[q[i].ind]=dC;
	    }
	    else
	    {
	        int L=q[i].L,R=q[i].R;
	        while(L<curL)
	        {
	            add(--curL);
	        }
	        while(L>curL)
	        {
	            remove(curL++);
	        }
	        while(R>curR)
	        {
	            add(++curR);
	        }
	        while(R<curR)
	        {
	            remove(curR--);
	        }
	        ans[q[i].ind]=dC;
	    }
	}
	for(int i=0;i<nq;i++)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}