Pagini recente » Cod sursa (job #1224192) | Cod sursa (job #2287481) | Cod sursa (job #1312034) | Cod sursa (job #1400969) | Cod sursa (job #207060)
Cod sursa(job #207060)
#include <stdio.h>
#include <bitset>
using namespace std;
char line[131072];
long col[131072],ind[131072],s[131071];
long n,m,g,T,i,l,c,x,y,aux,sol;
int comp(const void * n1, const void * n2){
return col[*((long*)n1)]-col[*((long*)n2)];
}
int bs1(int x){
int low=1,high=g,mid;
while (low<high){
mid=(low+high)/2;
if (col[ind[mid]]<=x) low=mid+1;
else high=mid;
}
return low;
}
int bs2(int x){
int low=1,high=g,mid;
while (low<high){
mid=(low+high+1)/2;
if (col[ind[mid]]<x) low=mid;
else high=mid-1;
}
return low;
}
int main(){
freopen("gropi.in","r",stdin);
freopen("gropi.out","w",stdout);
scanf("%ld %ld",&n,&g);
for (i=1;i<=g;++i){
scanf("%ld %ld",&line[i],&col[i]);
ind[i]=i;
}
//determinare numar de schimbari de linie
line[++g]=0;col[g]=0;ind[g]=g;line[++g]=0;col[g]=n+1;ind[g]=g;
qsort(ind+1,g,sizeof(long),comp);
for (i=1;i<g;++i)
if(line[ind[i]]!=line[ind[i+1]])s[i]=s[i-1]+1;
else s[i]=s[i-1];
scanf("%ld",&T);
for (;T;--T){
scanf("%ld %ld %ld %ld",&l,&c,&x,&y);
if (c>y){aux=c;c=y;y=aux;aux=l;l=x;x=aux;}
aux=bs1(c);
if (col[ind[aux]]>=y){printf("%ld\n",y-c+1+(l!=x));continue;}
sol=-s[aux-1];
if (l==line[ind[aux]])sol++;
aux=bs2(y);
sol+=s[aux-1];
if (x==line[ind[aux]])sol++;
printf("%ld\n",sol+y-c+1);
}
return 0;
}