Pagini recente » Borderou de evaluare (job #1819093) | Borderou de evaluare (job #1011645) | Borderou de evaluare (job #242583) | Borderou de evaluare (job #1517135) | Cod sursa (job #1988768)
#include <fstream>
#include <algorithm>
#define DIM 100010
#define x second
#define y first
using namespace std;
struct secv {
int st;
int dr;
int tip;
};
secv s[DIM];
pair<int, int> v[DIM];
int c, n, m, i, j, X1, X2, Y1, Y2, L, k, st, dr, mid, in1, in2, z1, z2, pls;
ifstream fin ("gropi.in");
ofstream fout("gropi.out");
int main () {
fin>>c>>n;
for (i=1;i<=n;i++)
fin>>v[i].x>>v[i].y;
sort(v+1, v+n+1);
if (n != 0) {
L = 1;
for (i=2;i<=n;i++)
if (v[i].x == v[i-1].x)
L++;
else {
k++;
s[k].st = i-1-L+1;
s[k].dr = i-1;
s[k].tip = v[i-1].x;
L = 1;
}
k++;
s[k].st = i-1-L+1;
s[k].dr = i-1;
s[k].tip = v[i-1].x;
}
fin>>m;
for (;m--;) {
fin>>X1>>Y1>>X2>>Y2;
if ((Y1 > Y2) || ( (Y1 == Y2) && (X1 > X2) )) {
swap(X1, X2);
swap(Y1, Y2);
}
/// caut zona in care se afla Y1 sau prima de dupa
st = 1;
dr = k;
while (st <= dr) {
mid = (st + dr)/2;
if (Y1 >= s[mid].st && Y1 <= s[mid].dr)
break;
if (Y1 > s[mid].dr)
st = mid+1;
else
dr = mid-1;
}
if(st <= dr) {
in1 = 1;
z1 = mid;
} else {
in1 = 0;
z1 = st;
}
/// caut zona in care se afla Y2 sau prima de inainte
st = 1;
dr = k;
while (st <= dr) {
mid = (st + dr)/2;
if (Y1 >= s[mid].st && Y1 <= s[mid].dr)
break;
if (Y1 > s[mid].dr)
st = mid+1;
else
dr = mid-1;
}
if (st <= dr) {
in2 = 1;
z2 = mid;
} else {
in2 = 0;
z2 = dr;
}
/// ambele capetele sunt in zone
if (in1 && in2) {
if (z1 == z2) {
if (X1 != X2) {
fout<<Y2-Y1+1+1<<"\n";
} else {
if (X1 != s[z1].tip)
fout<<Y2-Y1+1<<"\n";
else
fout<<Y2-Y1+1+2<<"\n";
}
} else {
pls = z2 - z1;
if (s[z1].tip == X1)
pls++;
if (s[z2].tip == X2)
pls++;
fout<<Y2-Y1+1+pls<<"\n";
}
continue;
}
if (!in1 && !in2) {
if (z1 - 1 == z2) {
if (X1 == X2)
fout<<Y2-Y1+1<<"\n";
else
fout<<Y2-Y1+2<<"\n";
} else {
pls = z2 - z1;
if (X1 == s[z1].tip)
pls++;
if (X2 == s[z2].tip)
pls++;
fout<<Y2-Y1+1+pls<<"\n";
}
continue;
}
pls = z2 - z1;
if (X1 == s[z1].tip)
pls++;
if (X2 == s[z2].tip)
pls++;
fout<<Y2-Y1+1+pls<<"\n";
}
return 0;
}