/**
                                    * بسم الله الرحمن الرحيم *
                ﴾ رَبِّ اشْرَحْ لِي صَدْرِي * وَيَسِّرْ لِي أَمْرِي * وَاحْلُلْ عُقْدَةً مِّن لِّسَانِي * يَفْقَهُوا قَوْلِي ﴿
*/
/// author : "ASGA"
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
struct sgt{
    vector<vector<int>>s;
    int lg,sz;
    void init(const vector<int>&a){
        int n=a.size();
        lg=__lg(n)+1;sz=1<<lg;
        s.resize(sz*2);
        for(int i=lg;i>=0;i--){
            for(int j=0;j<(1<<i);j++){
                int k=(1<<i)+j;
                if(i==lg){
                    if(j<n)s[k].push_back(a[j]);
                }
                else{
                    int l=0,r=0;
                    while(l<s[k*2].size()&&r<s[k*2+1].size()){
                        if(s[k*2][l]<s[k*2+1][r]){
                            s[k].push_back(s[k*2][l++]);
                        }
                        else{
                            s[k].push_back(s[k*2+1][r++]);
                        }
                    }
                    while(l<s[k*2].size())s[k].push_back(s[k*2][l++]);
                    while(r<s[k*2+1].size())s[k].push_back(s[k*2+1][r++]);
                }
            }
        }
    }
    vector<int>id;
    void get(int L,int R,int l,int r,int i){
        if(l>R||L>r)return;
        if(L<=l&&r<=R)id.push_back(i);
        else{get(L,R,l,(l+r)/2,i*2);get(L,R,(l+r)/2+1,r,i*2+1);}
    }
    int get(int l,int v,int st){
        id.clear();
        get(1,++l,1,sz,1);
        int ret=0;
        for(int&i:id){
            if(st)ret+=s[i].end()-lower_bound(s[i].begin(),s[i].end(),v);
            else ret+=upper_bound(s[i].begin(),s[i].end(),v)-s[i].begin();
        }
        return ret;
    }
};
int n;
vector<int>a;
sgt s;
void init(int N,int A[],int B[]){
    n=N;
    vector<array<int,2>>r;
    for(int i=0;i<n;i++)r.push_back({A[i],B[i]});
    sort(r.begin(),r.end());
    a.clear();s.s.clear();
    vector<int>b;
    for(auto&[i,j]:r)a.push_back(i);
    for(auto&[i,j]:r)b.push_back(j);
    s.init(b);
}
int can(int m,int k[]){
    sort(k,k+m);
    int x=0,y=0,c=0;
    for(int i=0;i<m;i++){
        int l=upper_bound(a.begin(),a.end(),k[i])-a.begin();
        if(l==0)return 0;
        l--;
        int tot=0;
        tot+=s.get(l,k[i],1);
        if(x>=k[i]){
            tot-=s.get(y,x,0)-c;
            tot+=s.get(y,k[i]-1,0);
        }
        if(tot<k[i])return 0;
        {
            int li=max(x,k[i]),ri=n,vv=s.get(l,k[i]-1,0);
            if(x>=k[i]){
                vv+=s.get(y,x,0)-c;
                vv-=s.get(y,k[i]-1,0);
            }
            while(li<=ri){
                int md=(li+ri)/2;
                if(s.get(l,md,0)-vv>=k[i])ri=md-1;
                else li=md+1;
            }
            ri++;
            int vl=s.get(l,ri,0)-vv;
            assert(vl>=k[i]);
            c=vl-k[i];x=ri;y=l;
        }
    }
    return 1;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |