#include "seats.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define mk make_pair
#define pb push_back
#define fr first
#define sc second
int n, m;
vector<vi> V;
vector<pii> seg;
vi lazy, r, c, modd;
pii operator + (pii a, pii b) {
if(a.fr == b.fr) return {a.fr, a.sc + b.sc};
return min(a, b);
}
void prop(int node, int flag) {
if(!lazy[node]) return;
seg[node].fr += lazy[node];
if(flag) {
lazy[2*node] += lazy[node];
lazy[2*node+1] += lazy[node];
}
lazy[node] = 0;
}
void update(int node, int l, int r, int p, int q, int val) {
prop(node, l!=r);
if(r < p or q < l) return;
if(p <= l and r <= q) {
lazy[node] += val;
prop(node, l!=r);
return;
}
int mid = (l+r)/2;
update(2*node, l, mid, p, q, val);
update(2*node+1, mid+1, r, p, q, val);
seg[node] = seg[2*node] + seg[2*node+1];
}
int count_9(int t[3][3]) {
int cnt = 0;
cnt += (t[0][0] + t[0][1] + t[1][0] + t[1][1])%2;
cnt += (t[0][1] + t[0][2] + t[1][1] + t[1][2])%2;
cnt += (t[1][0] + t[1][1] + t[2][0] + t[2][1])%2;
cnt += (t[1][1] + t[1][2] + t[2][1] + t[2][2])%2;
return cnt;
}
int set_value(int x, int y, int value) {
if(x <= 0 or y <= 0 or n < x or m < y) return 0;
int p1[3][3], p2[3][3]; // gerar duas matrizes 3x3
V[x][y] = value;
for(int i = -1; i <= 1; i++) {
for(int j = -1; j <= 1; j++) {
p1[i+1][j+1] = V[x+i][y+j] < value;
p2[i+1][j+1] = V[x+i][y+j] <= value;
}
}
return count_9(p2) - count_9(p1);
}
void give_initial_chart(int H, int W, vector<int> R, vector<int> C) {
n = H; m = W;
V.resize(n+2, vi(m+2, n*m));
modd.resize(n*m+1);
seg.resize(4*n*m, mk(0,1));
lazy.resize(4*n*m);
for(int i = 0; i < R.size(); i++) {
R[i]++; C[i]++;
V[R[i]][C[i]] = i;
}
r = R; c = C;
for(int x = 1; x <= n; x++) {
for(int y = 1; y <= m; y++) {
update(1, 0, n*m-1, V[x][y], n*m-1, set_value(x, y, V[x][y]));
}
}
cout << "inicial: " << seg[1].fr << " " << seg[1].sc << "\n";
}
int swap_seats(int a, int b) {
for(int i = -1; i <= 1; i++) {
for(int j = -1; j <= 1; j++) {
if(modd[V[r[a]+i][c[a]+j]] == 0 and V[r[a]+i][c[a]+j] != n*m)
modd[V[r[a]+i][c[a]+j]] = set_value(r[a]+i, c[a]+j, V[r[a]+i][c[a]+j]) + 10;
if(modd[V[r[b]+i][c[b]+j]] == 0 and V[r[b]+i][c[b]+j] != n*m)
modd[V[r[b]+i][c[b]+j]] = set_value(r[b]+i, c[b]+j, V[r[b]+i][c[b]+j]) + 10;
}
}
swap(V[r[a]][c[a]], V[r[b]][c[b]]);
swap(r[a], r[b]);
swap(c[a], c[b]);
for(int i = -1; i <= 1; i++) {
for(int j = -1; j <= 1; j++) {
if(modd[V[r[a]+i][c[a]+j]] != 0 and V[r[a]+i][c[a]+j] != n*m) {
int ch = set_value(r[a]+i, c[a]+j, V[r[a]+i][c[a]+j]);
ch -= modd[V[r[a]+i][c[a]+j]] - 10;
update(1, 0, n*m-1, V[r[a]+i][c[a]+j], n*m-1, ch);
}
if(modd[V[r[b]+i][c[b]+j]] != 0 and V[r[b]+i][c[b]+j] != n*m) {
int ch = set_value(r[b]+i, c[b]+j, V[r[b]+i][c[b]+j]);
ch -= modd[V[r[b]+i][c[b]+j]] - 10;
update(1, 0, n*m-1, V[r[b]+i][c[b]+j], n*m-1, ch);
}
modd[V[r[a]+i][c[a]+j]] = 0;
modd[V[r[b]+i][c[b]+j]] = 0;
}
}
return seg[1].sc;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |