Cod sursa(job #253637)

Utilizator cezar305Mr. Noname cezar305 Data 6 februarie 2009 09:10:49
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <cstdio>

using namespace std;
	
struct punct {
	int x, y;
};

int n, m, i, j, t, rez, d, aux, zero;
punct a, b, p1, p2, ax;

inline int my_abs(int x) {
	if (x >= 0)
		return x;
	return -x;
}

int main() {
	freopen("taxi.in", "r", stdin);
	freopen("taxi.out", "w", stdout);
	
	scanf("%d", &t);
	
	for (; t > 0; t--) {
        rez = 0;
        zero = 1;
		scanf("%d%d%d%d%d%d", &n, &m, &a.x, &a.y, &b.x, &b.y);
		if (a.x == b.x && a.y == b.y)
			rez = (n + 1) * (m + 1);
        else {
		
			if (b.x < a.x) {
				ax = a;
				a = b;
				b = ax;
			}		
			
			if (my_abs(a.x - b.x) == my_abs(a.y - b.y)) {			
				d = my_abs(a.x - b.x) + my_abs(a.y - b.y);
				if (d % 2 == 1) 
					zero = 0;
				else {
					d /= 2;			
					if (a.y < b.y) 
						rez += (n - b.x + 1) * (a.y + 1) + (m - b.y + 1) * (a.x + 1) - 2;
					else
						rez += (n - b.x + 1) * (m - a.y + 1) + (a.x + 1) * (b.y + 1) - 2;
					rez += my_abs(a.x - b.x) + 1;
				}
			}
			else {
		
				if (b.x < a.x) {
					aux = a.x;
					a.x = b.x;
					b.x = aux;
				}
				if (b.y < a.y) {
					aux = a.y;
					a.y = b.y;
					b.y = aux;
				}
				//n linii si m coloane
				if (a.x == b.x && a.y == b.y) 
					rez = (n + 1) * (m + 1);
					//printf("%d\n", (n + 1) * (m + 1));
				else {
					if (a.x == b.x) 
						if (my_abs(a.y - b.y) % 2 == 0)
							rez = n + 1;
							//printf("%d\n", n + 1);
						else
							zero = 0;
							//printf("0\n");
					else
						if (a.y == b.y) 
							if (my_abs(a.x - b.x) % 2 == 0)
								rez = m + 1;
								//printf("%d\n", m + 1);
							else
								zero = 0;
								//printf("0\n");
						else {
								{
								//formez cacatu
								d = my_abs(a.x - b.x) + my_abs(a.y - b.y);
								if (d % 2 == 1) 
									//printf("0\n");
									zero = 0;
								else {
									d /= 2;
									
									p1.x = a.x + d;
									p1.y = a.y;
									if (p1.x > b.x) {
										p1.y += p1.x - b.x;
										p1.x = b.x;
									}
									
									p2.x = a.x;
									p2.y = a.y + d;
									if (p2.y > b.y) {
										p2.x += p2.y - b.y;
										p2.y = b.y;
									}					
									rez = my_abs(p1.x - p2.x) + 1;
									if (my_abs(a.x - b.x) != my_abs(a.y - b.y)) {
										if (p1.y == a.y) 
											rez += p1.y;
										if (p1.x == b.x)
											rez += n - p1.x;
										if (p2.x == a.x)
											rez += p2.x;
										if (p2.y == b.y)
											rez += m - p2.y;
									}
									else {
										rez += (p1.y + 1) * (n - p1.x + 1) + (p2.x + 1) * (m - p2.y + 1) - 2;
									}
									///printf("%d\n", rez);
								}
							}
						}
				}
			}
		}
		printf("%d\n", rez * zero);
	}
	
	return 0;
}