Submission #966448

#TimeUsernameProblemLanguageResultExecution timeMemory
966448jcelinPaint (COI20_paint)C++14
100 / 100
624 ms456020 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

typedef pair<int,int> ii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<ll> vll;
typedef vector<pll> vpll;

#define PB push_back
#define PF push_front
#define PPB pop_back
#define PPF pop_front
#define X first
#define Y second
#define MP make_pair
#define all(x) (x).begin(), (x).end()

const int mod = 1e9 + 7; //998244353;
const int inf = 1e9 + 7;
const ll INF = 1e18 + 7;
const int logo = 20;
const int MAXN = 2e5 + 7;
const int cx = 1e5 + 7;
const int off = 1 << logo;
const int trsz = off << 1;
const int dx[] = {1, -1, 0, 0};
const int dy[] = {0, 0, -1, 1};
const int block = 600;


int par[MAXN], col[MAXN], n, m;
vi pop[MAXN], adj[MAXN];
vector<set<int>> sus[MAXN];
set<int> vel;
bool bg[MAXN], unutar[MAXN];

void merge(int a, int b){
	if(pop[a].size() < pop[b].size()) swap(a, b);
	
	if(pop[a].size() < block and pop[a].size() + pop[b].size() >= block){
		sus[a].resize(cx);
		vel.insert(a);
		bg[a] = 1;
		for(int x : adj[a]){
			x = par[x];
			sus[a][col[x]].insert(x);
		}
	}
	
	if(pop[a].size() + pop[b].size() >= block){
		for(int x : adj[b]){
			x = par[x];
			if(x != a) sus[a][col[x]].insert(x);
		}
		
		if(bg[b]){				
			sus[b].clear();
			sus[b].shrink_to_fit();
			vel.erase(b);
			bg[b] = 0;	
		}
	}
	
	for(int x : pop[b]) pop[a].PB(x), par[x] = a;
	for(int x : adj[b]) adj[a].PB(x);
	adj[b].clear();
	adj[b].shrink_to_fit();
	pop[b].clear();
	adj[b].shrink_to_fit();
}

void prin(){
	for(int i=0; i<n; i++){
		for(int j=0; j<m; j++) cout << col[par[i * m + j]] << " ";
		cout << "\n";
	}
}

void bojaj(int a, int c){
	a = par[a];
	col[a] = c;
	while(1){
		if(!bg[a]){
			bool naso = 0;
			for(int x : adj[a]){
				x = par[x];
				if(a != x and col[x] == c){
					merge(a, x);
					a = par[a];
					naso = 1;
					break;
				}
			}
			if(!naso) break;
		}else{
			if(sus[a][c].empty()) break;
			int x = *sus[a][c].begin();
			sus[a][c].erase(x);
			x = par[x];
			if(a != x and col[x] == c){
				merge(a, x);
				a = par[a];
			}
		}
	}
	
	
	if(!bg[a]){
		vi novi;
		for(int x : adj[a]){
			x = par[x];
			if(x != a and !unutar[x]){
				unutar[x] = 1;
				novi.PB(x);
			}
		}
		
		adj[a] = novi;
		for(int x : vel) if(unutar[x]) sus[x][c].insert(a);
		for(int x : novi) unutar[x] = 0;
	}else{
		for(int x : vel){
			x = par[x];
			if(a != x and sus[a][col[x]].count(x)) sus[x][c].insert(a);
		}
	}
}

void solve(){
	cin >> n >> m;
	for(int i=0; i<n; i++){
		for(int j=0; j<m; j++){
			int x;
			cin >> x;
			int cr = i * m + j;
			col[cr] = x;
			pop[cr].PB(cr);
			par[cr] = cr;
			for(int k=0; k<4; k++){
				int ni = i + dx[k], nj = j + dy[k];
				if(ni < 0 or ni >= n or nj < 0 or nj >= m) continue;
				int nc = ni * m + nj;
				adj[cr].PB(nc);
			}
		}
	}
	for(int i=0; i<n*m; i++) bojaj(i, col[i]);
	
	int q;
	cin >> q;
	while(q--){
		int r, s, c;
		cin >> r >> s >> c;
		r--, s--;
		bojaj(r * m + s, c);
		//prin();
	}
	
	prin();
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int tt = 1;
	//cin >> tt;
	while(tt--) solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...