Pagini recente » Cod sursa (job #1594395) | Cod sursa (job #1362724) | Cod sursa (job #2336816) | Cod sursa (job #529520) | Cod sursa (job #1877236)
#include <fstream>
#define NMAX 65000
using namespace std;
ifstream fin("bile.in");
ofstream fout("bile.out");
int TT[NMAX], RG[NMAX], CARD[NMAX], MAX=1;
int sol[NMAX];
int dl[] = {-1,0,1,0};
int dc[] = {0,1,0,-1};
bool V[252][252];
struct {
int x, y;
} A[NMAX];
int find(int x) {
int R, y;
for (R = x; TT[R] != R; R = TT[R]);
for (; TT[x] != x;) {
y = TT[x];
TT[x] = R;
x = y;
}
return R;
}
void unite(int x, int y) {
if (RG[x] > RG[y]) {
CARD[y] += CARD[x];
MAX = max(MAX, CARD[y]);
TT[y] = x;
}
else {
CARD[x] += CARD[y];
MAX = max(MAX, CARD[x]);
TT[x] = y;
}
if (RG[x] == RG[y]) RG[y]++;
}
int main() {
int N, vf;
fin>>N;
vf = N*N;
for(int i = 1; i <= vf; ++i) {
fin>>A[i].x>>A[i].y;
TT[i] = i;
RG[i] = 1;
CARD[i] = 1;
}
while(vf--) {
V[A[vf].x][A[vf].y] = true;
int R = find((A[vf].x-1)*N + A[vf].y);
for(int i = 0; i < 4; ++i) {
int xx = A[vf].x + dl[i];
int yy = A[vf].y + dc[i];
if(V[xx][yy]) {
int K = find((xx-1)*N + yy);
if(R != K) {
unite(R, K);
}
}
}
sol[vf] = MAX;
}
vf = N*N;
for(int i = 1; i < vf; ++i)
fout<<sol[i]<<'\n';
fout<<0<<'\n';
fin.close(); fout.close();
return 0;
}