1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std;
const int N=201; struct Mnode { int r,d; Mnode() {} Mnode(int _r,int _d):r(_r),d(_d) {} } m[N*N]; int n,q,root;
inline int get(int x,int y) { return x*n+y; }
void rollr(int l,int r,int d) { if (d==0) return; int rt=root; for (int i=0;i<(l-1+n)%n;i++) rt=m[rt].d; int pl=m[rt].d; for (int i=0;i<d;i++) pl=m[pl].r; for (int i=0;i<n;i++) { m[rt].d=pl; rt=m[rt].r; pl=m[pl].r; } for (int i=l-1;i<r;i++) rt=m[rt].d; int pr=m[rt].d; for (int i=0;i<n-d;i++) pr=m[pr].r; for (int i=0;i<n;i++) { m[rt].d=pr; rt=m[rt].r; pr=m[pr].r; } if (l<=0&&0<=r) for (int i=0;i<d;i++) root=m[root].r; }
void rollc(int l,int r,int d) { if (d==0) return; int rt=root; for (int i=0;i<(l-1+n)%n;i++) rt=m[rt].r; int pl=m[rt].r; for (int i=0;i<d;i++) pl=m[pl].d; for (int i=0;i<n;i++) { m[rt].r=pl; rt=m[rt].d; pl=m[pl].d; } for (int i=l-1;i<r;i++) rt=m[rt].r; int pr=m[rt].r; for (int i=0;i<n-d;i++) pr=m[pr].d; for (int i=0;i<n;i++) { m[rt].r=pr; rt=m[rt].d; pr=m[pr].d; } if (l<=0&&0<=r) for (int i=0;i<d;i++) root=m[root].d; }
inline void print() { for (int i=0;i<n;i++) { for (int j=0;j<n;j++) { if (j<n-1) printf("%d ",root); else printf("%d\n",root); root=m[root].r; } root=m[root].d; } }
int main() { scanf("%d%d",&n,&q); int tot=0; for (int i=0;i<n;i++) for (int j=0;j<n;j++) { m[tot++]=Mnode(get(i,(j+1)%n),get((i+1)%n,j)); } root=0; while (q--) { int k,l,r,d; scanf("%d%d%d%d",&k,&l,&r,&d); if (k==1) rollr(l,r,d); else rollc(l,r,d);
} print(); return 0; }
|