1 solutions

  • 0
    @ 2025-11-5 18:10:28

    C++ :

    #include<cstdio>
    #include<cstring>
    #include<cctype>
    #include<cmath>
    #include<algorithm>
    #define rep(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;i++)
    #define dwn(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;i--)
    using namespace std;
    const int Size=1<<16;
    char buffer[Size],*head,*tail;
    inline char Getchar() {
        if(head==tail) {
            int l=fread(buffer,1,Size,stdin);
            tail=(head=buffer)+l;
        }
        if(head==tail) return -1;
        return *head++;
    }
    inline int read() {
        int x=0,f=1;char c=Getchar();
        for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
        for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
        return x*f;
    }
    typedef long long ll;
    const int maxn=160010;
    int n,m,q,lim;
    int A[maxn],B[maxn],C[maxn],f[maxn],ans[maxn];
    int maxv[maxn<<2],addv[maxn<<2];
    void build(int o,int l,int r) {
    	if(l==r) maxv[o]=addv[o]=-l;
    	else {
    		int mid=l+r>>1,lc=o<<1,rc=lc|1;
    		build(lc,l,mid);build(rc,mid+1,r);
    		maxv[o]=max(maxv[lc],maxv[rc]);
    	}
    }
    void update(int o,int l,int r,int ql,int qr,int v) {
    	if(ql<=l&&r<=qr) addv[o]+=v,maxv[o]+=v;
    	else {
    		int mid=l+r>>1,lc=o<<1,rc=lc|1;
    		if(ql<=mid) update(lc,l,mid,ql,qr,v);
    		if(qr>mid) update(rc,mid+1,r,ql,qr,v);
    		maxv[o]=max(maxv[lc],maxv[rc])+addv[o];
    	}
    }
    int Sum[maxn],blo[maxn];
    struct Query {
    	int l,r,id;
    	bool operator < (const Query& b) const {
    		if(blo[l]!=blo[b.l]) return l<b.l;
    		return (blo[l]&1)?r<b.r:r>b.r;
    	}
    }Q[maxn];
    void Add(int x) {
    	if(!x) return;
    	update(1,1,n,x,n,1);
    }
    void Del(int x) {
    	if(!x) return;
    	update(1,1,n,x,n,-1);
    }
    int main() {
    	//freopen("match.in","r",stdin);
    	//freopen("match.out","w",stdout);
    	n=read();m=read();lim=read();int SIZE=(int)sqrt(m);
    	rep(i,1,n) A[i]=read();
    	rep(i,1,m) B[i]=read(),blo[i]=(i-1)/SIZE+1;
    	sort(A+1,A+n+1);
    	rep(i,1,m) {
    		int l=0,r=n+1,mid;
    		while(l+1<r) if(A[mid=l+r>>1]+B[i]<=lim) l=mid; else r=mid;
    		f[i]=l;Sum[i]=Sum[i-1];
    		if(!f[i]) Sum[i]++;
    	}
    	build(1,1,n);
    	q=read();
    	rep(i,1,q) Q[i].id=i,Q[i].l=read(),Q[i].r=read(),ans[i]=(Q[i].r-Q[i].l+1)-(Sum[Q[i].r]-Sum[Q[i].l-1]);
    	sort(Q+1,Q+q+1);
    	int l=1,r=0;
    	rep(i,1,q) {
    		while(l>Q[i].l) Add(f[--l]);
    		while(r<Q[i].r) Add(f[++r]);
    		while(l<Q[i].l) Del(f[l++]);
    		while(r>Q[i].r) Del(f[r--]);
    		ans[Q[i].id]-=max(0,maxv[1]);
    	}
    	rep(i,1,q) printf("%d\n",ans[i]);
    	return 0;
    }
    
    
    • 1

    Information

    ID
    18810
    Time
    10000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By