1 solutions
-
0
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