#include #include #include #include using namespace std; ifstream cin("parc.in"); ofstream cout("parc.out"); const int mxN = 3e4; typedef long double ld; int vert[mxN+10],oriz[mxN+10], l, r; int main() { // Citim datele problemei int latime , inaltime; cin >> latime >> inaltime ; int xStart,yStart; cin >> xStart >> yStart; int xFinal,yFinal; cin >> xFinal >> yFinal; int nrVert, nrOriz; cin >> nrVert; for(int i = 1;i <= nrVert;i++) { cin >> l >> r; if(l > r) swap(l,r); r--; for(int it = l;it<=r;it++) vert[it] = 1; } cin >> nrOriz; for(int i = 1;i<=nrOriz;i++) { cin >> l >> r; if(l > r) swap(l,r); r--; for(int it = l;it<=r;it++) oriz[it] = 1; } // Cerinta 1 bool swappedX = false, swappedY = false; if(xStart > xFinal) swappedX = true, swap(xStart,xFinal); if(yStart > yFinal) swappedY = true, swap(yStart,yFinal); int latimeDif = xFinal - xStart, inaltimeDif = yFinal - yStart, cntGri = 0; for(int i = xStart;i <= xFinal; i++) latimeDif -= vert[i], cntGri += vert[i]; for(int i = yStart;i <= yFinal;i++) inaltimeDif -= oriz[i], cntGri += oriz[i]; ld d = latimeDif * latimeDif + inaltimeDif * inaltimeDif; cout << fixed << setprecision(10) << cntGri + sqrtl(d) << '\n'; // Cerinta 2 if(swappedX) { swap(xStart,xFinal); xStart = latime - xStart; xFinal = latime - xFinal; reverse(vert,vert+latime); } if(swappedY) { swap(yStart,yFinal); yStart = inaltime - yStart; yFinal = inaltime - yFinal; reverse(oriz,oriz + inaltime); } for(int i = 1;i<=latime;i++) // efectuam sume partiale. vert[i]+=vert[i-1]; for(int i = 1;i<=inaltime;i++) oriz[i] += oriz[i-1]; int gcd = __gcd(inaltimeDif,latimeDif), nrDrumuri = 1; int dx = latimeDif / gcd, dy = inaltimeDif / gcd; // cautare binara pentru coordonatele punctelor laticiale. for(int i = 1;i targetX) r = mid-1; else l = mid+1; } int pozX = sol; l = yStart, r = yFinal, pref = 0, sol = -1; if(yStart != 0) pref = oriz[yStart-1]; while(l <= r) { int mid = (l + r) / 2; int nrGri = oriz[mid] - pref, total = mid - yStart + 1; int nrAlbe = total - nrGri; if(nrAlbe == targetY) sol = mid; if(nrAlbe > targetY) r = mid-1; else l = mid+1; } int pozY = sol; if(pozX != -1 && pozY != -1 && vert[pozX] - vert[pozX-1] && oriz[pozY] - oriz[pozY-1]) nrDrumuri*=2; } cout << nrDrumuri << '\n'; return 0; }