Cod sursa(job #253940)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 6 februarie 2009 13:46:48
Problema Grendizer Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 2.14 kb
#include <stdio.h>
#include <math.h>

#define LINII 700
#define COLOANE 700
#define NORM 400

long n, m, i, x, y, a[1024][1024], r, boom;

inline long ok(long x, long y) {
	if (x <= LINII && x >=1 && y <= COLOANE && y >= 1) {
		return 1;
	}
	return 0;
}

long parc_contur(long x, long y, long r) {
	long lin = 0, col = 0, sum = 0, dif = 0, h = 0, vb1 = 0;
	//vest in sus
	lin = x;col = y - r;h = 0;
	if (!ok(lin, col)) {
		lin -= 1 - col;
		col = 1;
		if (!ok(lin, col)) {
			vb1 = 1;
		}
	}
	if (vb1 == 0) {
		while (col != y) {
			++h;
			if (h != 1) {
				--lin;++col;
			}
			if (ok(lin, col)) {
				sum += a[lin][col];
			} else {
				break;
			}
		}
	}
	//est in sus
	lin = x;col = y + r;h = 0;
	if (!ok(lin, col)) {
		lin -= col - COLOANE;
		col = COLOANE;
		if (!ok(lin, col)) {
			vb1 = 1;
		}
	}	
	if (vb1 == 0) {
		while (col != y) {
			++h;
			if (h != 1) {
				--lin;--col;
			}		
			if (ok(lin, col)) {
				sum += a[lin][col];
			}
		}
	}
	//jos in vest
	lin = x + r;col = y;h = 0;
	if (!ok(lin, col)) {
		col -= lin - LINII;
		lin = LINII;
		if (!ok(lin, col)) {
			vb1 = 1;
		}
	}	
	if (vb1 == 0) {
		while (lin != x) {
			++h;
			if (h != 1) {
				--lin;--col;
			}
			if (ok(lin, col)) {
				sum += a[lin][col];
			}
		}
	}
	//jos in est
	lin = x + r;col = y;h = 0;
	if (!ok(lin, col)) {
		col += lin - LINII;
		lin = LINII;
		if (!ok(lin, col)) {
			vb1 = 1;
		}
	}	
	while (lin != x) {
		++h;
		if (h != 1) {
			--lin;++col;
		}
		if (ok(lin, col)) {
			sum += a[lin][col];
		}
	}
	if (ok(x - r, y)) dif += a[x - r][y];	
	if (ok(x + r, y)) dif += a[x + r][y];
	if (ok(x, y - r)) dif += a[x][y - r];	
	if (ok(x, y + r)) dif += a[x][y + r];	
	return sum - dif;
}

int main() {
	freopen("grendizer.in", "r", stdin);
	freopen("grendizer.out", "w", stdout);
	scanf("%ld %ld", &n, &m);
	for (i = 1; i <= n; ++i) {
		scanf("%ld %ld", &x, &y);
		x += NORM;
		y += NORM;
		++a[x][y];
	}
	for (i = 1; i <= m; ++i) {
		scanf("%ld %ld %ld", &x, &y, &r);
		x += NORM;y += NORM;
		boom = 0;
		boom = parc_contur(x, y, r);
		printf("%ld\n", boom);
	}
	return 0;
}