Code optimized for memory constraint
imbipulkumar opened this issue · 0 comments
imbipulkumar commented
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;
}