➤ 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!!