Pagini recente » Cod sursa (job #7904) | Simulare 44 | Cod sursa (job #1653673) | Cod sursa (job #2248172) | Cod sursa (job #197723)
Cod sursa(job #197723)
#include<stdio.h>
#include<algorithm>
using namespace std;
struct gr {int x,y;}g[100102];
int rez,u,mij,x1,x2,y1,y2,c,n,m,i,p,C[100102];
int cmp(gr a,gr b){
return a.y<b.y;
}
int main(){
FILE *f=fopen("gropi.in","r");
fscanf(f,"%d %d",&c,&n);
for(i=1;i<=n;i++)
fscanf(f,"%d %d",&g[i].x,&g[i].y);
sort(g+1,g+n+1,cmp);
p=0;
int k=0;
fscanf(f,"%d",&m);
for(i=2;i<=n;i++){
C[i]=C[i-1]+g[i].y-g[i-1].y;
if(g[i].x!=g[i-1].x)
C[i]++;
}
FILE *gg=fopen("gropi.out","w");
int aux;
int pp;
for(i=1;i<=m;i++){
fscanf(f,"%d %d %d %d",&x1,&y1,&x2,&y2);
//caut binar cea mai apropiata groapa
if(y1>y2){
aux=y1;y1=y2; y2=aux;
aux=x1;x1=x2; x2=aux;
}
p=1;
u=n;
while(p<=u){
mij=(p+u)/2;
if(y1<=g[mij].y)
u=mij-1;
else
p=mij+1;
}
rez=g[p].y-y1+1;
if(g[p].x==x1)
rez++;
//caut ultima groapa
pp=p;
p=1;
u=n;
while(p<=u){
mij=(p+u)/2;
if(y2>=g[mij].y)
p=mij+1;
else
u=mij-1;
}
rez+=C[u]-C[pp];
rez+=y2-g[u].y;
if(x2==g[u].x)
rez++;
if(pp>u){
rez=y2-y1+1;
if(x1!=x2)
rez++;
}
fprintf(gg,"%d\n",rez);
}
fclose(f);
fclose(gg);
return 0;
}