小红的双排列查询

期望: pts

实际: pts

#pragma GCC optimize(3,"Ofast")
#include <bits/stdc++.h>
#define v vector 
#define vi vector<int>
#define mi multiset<int>
#define int long long 
using namespace std;

const int maxa=2.5E5;
template<class T>vector<vector<T>>vertices(size_t n){return vector<vector<T>>(n);}

struct Qry {
    int l,r,id,m,bk;
    bool operator<(const Qry &other) const {if (bk!=other.bk) return bk<other.bk; return (bk&1)?(r<other.r):(r>other.r);}
};

int n, q;
vi a,ans,cnt,d;
v<Qry> q_;  
int tree[maxa]; 
void upt(int idx, int val) {
    while (idx<maxa) {tree[idx]+=val; idx+=idx&-idx;}
}
 
int qry(int idx) {
    int sum=0;
    while (idx) {sum+=tree[idx]; idx-=idx&-idx;}
    return sum;
}

void add(int x, mi &_s) {
    int _cnt=cnt[x];
    ++cnt[x];
    if (_cnt==2) {if (d[x]==0) {d[x]=1; upt(x,1);}} 
    else if (_cnt==1) {if (d[x]==1) {d[x]=0; upt(x,-1);}}
    _s.insert(x); 
}

void remove(int x, mi &_s) {
    auto it=_s.find(x); 
    if (it!=_s.end()) _s.erase(it); 
    int _cnt=cnt[x];
    --cnt[x]; //
    if (_cnt==2) {if (d[x]==0) {d[x]=1; upt(x,1);}} 
    else if (_cnt==3) {if (d[x]==1) {d[x]=0; upt(x,-1);}}
}
 
int get_max(mi &_s) {return _s.empty()?0:*_s.rbegin();}
 
int32_t main() {
    ios::sync_with_stdio(false); cin.tie(NULL); 
    cin.rdbuf() -> pubsetbuf(NULL, 1<<20);
    cout.rdbuf() -> pubsetbuf(NULL, 1<<20);
    
    cin>>n>>q;
    a.resize(n); 
    for (int i=0; i<n; ++i) cin>>a[i];
    int bk_sz=sqrt(n);
    q_.resize(q); 
    for (int i=0; i<q; ++i) {
        int l,r; cin>>l>>r; --l;--r;
        int len=r-l+1;
        q_[i]={l,r,i,len/2,l/bk_sz};
    }
    
    sort(q_.begin(), q_.end()); 
    ans.resize(q,0);
    cnt.assign(maxa,0);
    d.assign(maxa,1); 
    memset(tree,0,sizeof(tree));
    
    for (int i=1; i<maxa; ++i) upt(i,1); 
    mi _s;
    int l_=0, r_=-1;
    for (auto & _q:q_) {
        int L=_q.l, R=_q.r, id=_q.id, m=_q.m;
        if ((R-L+1)%2!=0) {ans[id]=0; continue;}
        
        while (r_<R) add(a[++r_], _s);
        while (l_>L) add(a[--l_], _s);
        while (r_>R) remove(a[r_--], _s);
        while (l_<L) remove(a[l_++], _s);

        if (get_max(_s)>m) ans[id]=0;
        else ans[id]=(qry(m)==0);
    }
    for (int i=0; i<q; ++i) cout<<(ans[i]?"Yes\n":"No\n");
}