➤ Problem Link : FREQUENT
👉 Hint : edit please
✅ C++ Solution :
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
ll st[800001];
ll arr[500001];
int leftp[500001],rightp[500001];
int cnt[800005];
int offset=100001;
void build(int v, ll l, ll r)
{
if(l==r)
{
st[v]=cnt[l];
return;
}
int mid=(l+r)/2;
build(2*v,l,mid);
build(2*v+1,mid+1,r);
st[v]=max(st[2*v],st[2*v+1]);
}
int query(int v, int s, int e,int l, int r)
{
if(s>r || e<l)
return 0;
if(s>=l && e<=r)
return st[v];
int mid=(s+e)/2;
return max(query(2*v,s,mid,l,r),query(2*v+1,mid+1,e,l,r));
}
int main()
{
while(1)
{
int n,q;
cin>>n;
if(n==0)
break;
cin>>q;
memset(cnt,0,sizeof(cnt));
ll mx=-1;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
arr[i]+=offset;
cnt[arr[i]]++;
mx=max(mx,arr[i]);
}
leftp[1]=1;
for(int i=2;i<=n;i++)
{
if(arr[i]==arr[i-1])
leftp[i]=leftp[i-1];
else
leftp[i]=i;
}
rightp[n]=n;
for(int i=n-1;i>=1;i--)
{
if(arr[i]==arr[i+1])
rightp[i]=rightp[i+1];
else
rightp[i]=i;
}
build(1,1,mx);
int a,b,ans;
while(q--)
{
cin>>a>>b;
if(arr[a]==arr[b])
{
cout<<b-a+1<<"\n";
continue;
}
int p=rightp[a];
int m=leftp[b];
ans=max(p-a+1,b-m+1);
ans=max(ans,query(1,1,mx,arr[p+1],arr[m-1]));
cout<<ans<<"\n";
}
}
}
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!!
