Pagini recente » Cod sursa (job #510405) | Cod sursa (job #423916) | Cod sursa (job #281589) | Cod sursa (job #1722874) | Cod sursa (job #2229537)
#include <iostream>
#include <vector>
#include <fstream>
#define pii pair<int,int>
using namespace std;
const int MAXN = 255;
ifstream in("bile.in");
ofstream out("bile.out");
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
int n,maxim = 1,card[MAXN*MAXN],rang[MAXN*MAXN],tata[MAXN*MAXN],ans[MAXN*MAXN];
bool matrice[MAXN][MAXN];
vector<pii>v;
int Find(int nod){
int stapan = nod;
while(tata[stapan] != stapan)
stapan = tata[stapan];
while(tata[nod] != stapan){
int copie = nod;
tata[copie] = stapan;
nod = tata[nod];
}
return stapan;
}
int Union(int x,int y){
if(x==y)
return 0;
if(rang[x] > rang[y]) {
card[x] += card[y];
maxim = max(maxim,card[x]);
tata[y] = x;
}else if(rang[y] <= x) {
card[y] += card[x];
maxim = max(maxim,card[y]);
tata[x] = y;
}
if(rang[x] == rang[y])
rang[y]++;
}
int F(int x,int y){
return (x - 1)*n + y;
}
bool in_matrice(int x,int y){
if(x >= 1 && y >= 1 && x <= n && y <= n && matrice[x][y])
return true;
return false;
}
void Vecin(int x,int y){
int xnou,ynou;
for(int i = 0; i < 4; i++){
xnou = x + dx[i];
ynou = y + dy[i];
if(in_matrice(xnou,ynou))
Union(Find(F(x,y)),Find(F(xnou,ynou)));
}
}
int main()
{
in>>n;
v.reserve(n*n);
for(int i = 1; i <= n*n; i++){
tata[i] = i;
rang[i] = 1;
card[i] = 1;
}
for(int i = 1; i <= n*n; i++){
int x,y;
in>>x>>y;
v.push_back({x,y});
}
for(int i = n*n - 1; i >= 0; i--){
matrice[v[i].first][v[i].second] = true;
Vecin(v[i].first,v[i].second);
ans[i] = maxim;
}
for(int i = 1; i <= n * n; i++)
out<<ans[i]<<"\n";
return 0;
}