Cod sursa(job #133792)

Utilizator nimicLeoveanu Mihaita Alexandru nimic Data 9 februarie 2008 19:20:07
Problema Eprubeta Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
#include <algorithm>
#define MaxN 2048

using namespace std;

unsigned n, m, A, B, MOD;
unsigned a[MaxN][MaxN];

inline void schimba(unsigned *a, unsigned *b, unsigned n){
       unsigned nr=n;  
       while (nr--)
           swap(a[nr], b[nr]);
       reverse(a, a+n);
       reverse(b, b+n);
}

inline void rotate(unsigned x, unsigned y){
       unsigned st=x, fn=y;
       while (st<fn){
             schimba(a[st]+x, a[fn]+x, y-x+1);
             st++;
             fn--;
       }
}

inline void suma(unsigned x, unsigned y){
       unsigned sum=0;
       y++;
       for (unsigned i=x; i<y; i++)
           for (unsigned j=x; j<y; j++)
               sum += a[i][j];
       printf("%u\n", sum);
}

int main(){
    freopen("eprubeta.in", "r", stdin);
    freopen("eprubeta.out", "w", stdout);
    scanf("%d %d %d %d %d\n", &n, &m, &MOD, &A, &B);
    for (unsigned i=0; i<n; i++)
        for (unsigned j=0; j<n; j++)
            a[i][j] = ((i+A)*(j+B)/4)%MOD;
    while (m--){
          unsigned op, x, y;
          scanf("%d %d %d", &op, &x, &y);
          if (op==1) rotate(x, y); else suma(x, y);
    }
    unsigned rez=0;
    for (unsigned i=0; i<n; i++){
        unsigned sum=0;
        for (unsigned j=0; j<n; j++)
            sum += a[i][j];
        rez += sum*sum*(i+1);
        }
    printf("%u\n", rez);
}