显示是 SIGSEGV
不知道为什么
(N为200005也是RE)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=500005;
ll n,m,l,r,a[N],pos[N],ans[N],num1[N],num2[N],cnt,res;
struct node{
ll l,r,k,ID;
inline bool operator < (const node &b)const{
if(pos[l]!=pos[b.l]) return l<b.l;
if(pos[l]&1) return r<b.r;
else return r>b.r;
}
}xu[N];
inline ll read()
{
ll x=0;int b=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') b=-1;
c=getchar();
}
while(isdigit(c)){
x=x*10+c-'0';
c=getchar();
}
return x*b;
}
void add(ll w)
{
++num1[a[w]];
--num2[num1[a[w]]-1];
++num2[num1[a[w]]];
res=max(res,num1[a[w]]);
return ;
}
void sub(ll w)
{
--num1[a[w]];
++num2[num1[a[w]]];
--num2[num1[a[w]]+1];
if(num2[res]==0)
res--;
return ;
}
int main()
{
n=read();m=read();cnt=sqrt(n);
for(int i=1;i<=n;++i){
a[i]=read();
pos[i]=(i-1)/cnt+1;
}
for(int i=1;i<=m;++i)
{
xu[i].l=read(); xu[i].r=read();
xu[i].k=read(); xu[i].ID=i;
}
sort(xu+1,xu+1+m);
l=1;r=0;res=0;
for(int i=1;i<=m;++i)
{
while(xu[i].l<l) add(--l);
while(xu[i].r>r) add(++r);
while(xu[i].l>l) sub(l++);
while(xu[i].r<r) sub(r--);
ans[xu[i].ID]=(res*xu[i].k>=xu[i].r-xu[i].l+1);
}
for(int i=1;i<=m;++i)
ans[i]==1?printf("YES\n"):printf("NO\n");
return 0;
}