用别的经验题都试过了,没有问题,但是交上去就是一直 RE qwq,求差错。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<map>
#define int long long
using namespace std;
const int N=5e5+9;
const int M=5e5+9;
struct node{
int l,r;
int id;
int k;
}q[N];
int n,Q,bl;
bool ans[N];
int a[N],b[N];
int top;
int L=1,R=0;
int cnt[N],sum[N];
int tot;
map<int,int> mp;
int read()
{
int f=1,x=0;
char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^'0');s=getchar();}
return f*x;
}
void Prepare()
{
sort(b+1,b+1+n);
for(int i=1;i<=n;i++)
if(i==1 or b[i-1]!=b[i])
mp[b[i]]=++top;
for(int i=1;i<=n;i++)
a[i]=mp[a[i]];
}
bool cmp(node x,node y)
{
return (x.l/bl==y.l/bl) ? x.r<y.r : x.l<y.l;
}
void del(int x)
{
sum[cnt[x]]--;
if(!sum[cnt[x]] and tot==cnt[x])
tot=cnt[x]-1;
cnt[x]--;
sum[cnt[x]]++;
}
void add(int x)
{
sum[cnt[x]]--;
cnt[x]++;
sum[cnt[x]]++;
tot=max(tot,cnt[x]);
}
signed main()
{
n=read(); Q=read(); bl=pow(n,0.666);
for(int i=1;i<=n;i++)
b[i]=a[i]=read();
Prepare();
for(int i=1;i<=Q;i++)
{
q[i].l=read(); q[i].r=read();
q[i].k=read();
q[i].id=i;
}
sort(q+1,q+1+Q,cmp);
for(int i=1;i<=Q;i++)
{
while(L<q[i].l) del(a[L++]);
while(L>q[i].l) add(a[--L]);
while(R>q[i].r) del(a[R--]);
while(R<q[i].r) add(a[++R]);
int two=q[i].r-q[i].l+1;
int one=tot*q[i].k;
if(one>=two)
ans[q[i].id]=true;
else ans[q[i].id]=false;
//ans[q[i].id]=((tot*q[i].k) >= (q[i].r-q[i].l+1));
}
for(int i=1;i<=Q;i++)
if(ans[i])
printf("YES\n");
else printf("NO\n");
return 0;
}