Cod sursa(job #162939)

Utilizator FlorinC1996Florin C FlorinC1996 Data 20 martie 2008 22:18:23
Problema Eprubeta Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
 #include <cstdio>   
#include <ctime>   
#include <cstdlib>   
#include <algorithm>   
  
#define maxN 2048   
  
using namespace std;   
  
unsigned char 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;   
}