Pagini recente » Cod sursa (job #2850901) | Cod sursa (job #3249539) | Cod sursa (job #3268537) | Cod sursa (job #3241236) | Cod sursa (job #3283103)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int n;
ifstream in ("bile.in");
ofstream out ("bile.out");
int mat[302][302];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int tata[1000000];
int frec[1000000];
bool inmat(int x,int y){
if(x<=n&&x>0&&y<=n&&y>0)
return true;
return false;
}
vector <pair<int,int>> edge;
vector <int> ras;
int rad(int x){
if(tata[x]==x)
return x;
return (rad(tata[x]));
}
bool comp(int x, int y){
int rx=rad(x);
int ry=rad(y);
if(rx==ry)
return true;
return false;
}
void unite(int x,int y){
int rx=rad(x);
int ry=rad(y);
if(frec[rx]<frec[ry]){
tata[ry]=rx;
frec[rx]+=frec[ry];
}
else{
tata[rx]=ry;
frec[ry]+=frec[rx];
}
}
int main(){
in>>n;
for(int i=1;i<=n*n;i++){
tata[i]=i;
frec[i]=1;
}
for(int i=1;i<=n*n;i++){
int x,y;
in>>x>>y;
edge.push_back({x,y});
}
int contor=0;
int maxim=0;
for(int i=edge.size()-1;i>=0;i--){
ras.push_back(maxim);
int x,y;
x=edge[i].first;
y=edge[i].second;
mat[x][y]=1;
int nodCurent=(x-1)*n+y;
maxim=max(maxim,frec[tata[nodCurent]]);
for(int k=0;k<4;k++){
int vecin=(x+dx[k]-1)*n+y+dy[k];
if(inmat(x+dx[k],y+dy[k])==true)
if(mat[x+dx[k]][y+dy[k]]==1){
if(comp(nodCurent,vecin)==false){
unite(nodCurent,vecin);
if(frec[tata[nodCurent]]>maxim)
maxim=max(maxim,frec[tata[nodCurent]]);
}
}
}
maxim=max(maxim,frec[tata[nodCurent]]);
}
for(int i=ras.size()-1;i>=0;i--) {
out<<ras[i]<< '\n';
}
return 0;
}