#pragma GCC optimize(2) #pragma GCC optimize(3)
#include <bits/stdc++.h> using namespace std; template <typename T> inline void read(T &a){ T w=1; a=0; char ch=getchar(); for(;ch < '0' || ch > '9';ch=getchar()) if(ch == '-') w=-1; for(;ch>='0'&&ch<='9';ch=getchar()) a=(a<<3)+(a<<1)+(ch^48); a*=w; } template <typename T> inline void ckmax(T &a, T b){a = a > b ? a : b;} template <typename T> inline void ckmin(T &a, T b){a = a < b ? a : b;} #define fi first #define se second #define pb push_back #define mp make_pair #define pii pair<int, int> #define vi vector<int> #define Debug(x) cout << #x << " = " << x << endl #define For(i,l,r) for (int i = l; i <= r; ++i) #define foR(i,l,r) for (int i = l; i >= r; --i) #define mck insert #define era erase const int N = 10; int n, m; int Id (int x, int y) { return (x - 1) * n + y; } set <int> emp; int val[N][N], res[N][N]; pii gra[N * N]; inline void cache () { For (i, 1, n) For (j, 1, n) res[i][j] = val[i][j]; } inline bool diff () { For (i, 1, n) For (j, 1, n) if (res[i][j] != val[i][j]) return true; return false; }
inline void upd (int k, int v) { int top = 0; for (auto x : emp) { top++; if (top == k) { val[gra[x].fi][gra[x].se] = v; emp.era(x); break; } } }
inline void Mckenna (int x, int y, int fx, int fy) { val[x][y] = val[fx][fy]; emp.era(Id(x, y)); emp.mck(Id(fx, fy)); val[fx][fy] = 0; }
inline void move (int to) { if (to == 0) { For (i, 1, n - 1) For (j, 1, n) { if (!val[i][j]) For (k, i + 1, n) if (val[k][j]) { Mckenna(i, j, k, j); break; } } } if (to == 1) { foR (i, n, 2) For (j, 1, n) { if (!val[i][j]) { foR (k, i - 1, 1) if (val[k][j]) { Mckenna(i, j, k, j); break; } } } } if (to == 2) { For (j, 1, n - 1) For (i, 1, n) { if (!val[i][j]) For (k, j + 1, n) if (val[i][k]) { Mckenna(i, j, i, k); break; } } } if (to == 3) { foR (j, n, 2) For (i, 1, n) { if (!val[i][j]) foR (k, j - 1, 1) if (val[i][k]) { Mckenna(i, j, i, k); break; } } } }
int tmp;
inline void merge (int to) { if (to == 0) { For (i, 1, n - 1) For (j, 1, n) { if (val[i][j] == val[i + 1][j] && val[i][j]) { tmp += val[i][j] * 2; val[i + 1][j] = 0; val[i][j] *= 2; emp.mck(Id(i + 1, j)); } } } if (to == 1) { foR (i, n, 2) For (j, 1, n) { if (val[i][j] == val[i - 1][j] && val[i][j]) { tmp += val[i][j] * 2; val[i - 1][j] = 0; val[i][j] *= 2; emp.mck(Id(i - 1, j)); } } } if (to == 2) { For (j, 1, n - 1) For (i, 1, n) { if (val[i][j] == val[i][j + 1] && val[i][j]) { tmp += val[i][j] * 2; val[i][j + 1] = 0; val[i][j] *= 2; emp.mck(Id(i, j + 1)); } } } if (to == 3) { foR (j, n, 2) For (i, 1, n) { if (val[i][j] == val[i][j - 1] && val[i][j]) { tmp += val[i][j] * 2; val[i][j - 1] = 0; val[i][j] *= 2; emp.mck(Id(i, j - 1)); } } } }
inline void print () { For (i, 1, n) { For (j, 1, n) cout << val[i][j] << " "; puts(""); } puts(""); }
int main() { read(n); read(m); For (i, 1, n) For (j, 1, n) emp.mck(Id(i, j)), gra[Id(i,j)] = mp(i, j); int x, y, v; read(x), read(y), read(v); emp.era(Id(x, y)); val[x][y] = v; read(x), read(y), read(v); emp.era(Id(x, y)); val[x][y] = v; int Ans1 = 0, Ans2 = 0; For (i, 1, m) { int d, k, v; read(d); read(k); read(v); cache(); move(d); tmp = 0; merge(d); move(d); Ans2 += tmp; if ( diff () ) Ans1++; else break; int r = emp.size(); upd (1 + (k % r), v); } printf ("%d\n%d", Ans1, Ans2); return 0; }
|