Cod sursa(job #596258)

Utilizator cont_de_testeCont Teste cont_de_teste Data 16 iunie 2011 16:38:08
Problema Eprubeta Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <algorithm>

#define maxN 2048

using namespace std;

int mat[maxN][maxN];

int main() {
	freopen("eprubeta.in", "rt", stdin);
	freopen("eprubeta.out", "wt", stdout);

	int N, M;
	scanf("%d %d", &N, &M);

	int X, A, B;
	scanf("%d %d %d", &X, &A, &B);

	for (int i = 0; i < N; ++i)
		for (int j = 0; j < N; ++j)
			// scanf("%d", &mat[i][j]);
			mat[i][j] = ((i + A) * (j + B) / 4) % X;

	long long ops = 0;

	for (int i = 0; i < M; ++i) {
		int o, a, b;
		scanf("%d %d %d", &o, &a, &b);

		ops += (b-a+1)*(b-a+1);

		if (o == 2) {
			int sum = 0;
			for (int j = a; j <= b; ++j)
				for (int k = a; k <= b; ++k)
					sum += mat[j][k];
			printf("%d\n", sum);
		} else {
			int l = b-a+1;

			for (int j = 0; j < l/2; ++j) {
				for (int k = 0; k < l; ++k)
					swap(mat[a+j][a+k], mat[b-j][b-k]);
			}

			if (l & 1) {
				for (int j = 0; j < l/2; ++j)
					swap(mat[a + l/2][a+j], mat[a + l/2][b-j]);
			}
		}
	}

	fprintf(stderr, "ops = %lld\n", ops);

	// encriptam matricea
	unsigned int result = 0;
	for (int i = 0; i < N; ++i) {
		unsigned int sum = 0;
		for (int j = 0; j < N; ++j)
			sum += mat[i][j];
		result += sum*sum*(i+1);
	}

	printf("%u\n", result);

	return 0;
}