#include <bits/stdc++.h>
using namespace std;
vector<vector<vector<bool>>> gr;
vector<int> cs;
vector<vector<int>> sp;
vector<pair<int,int>> spp;
vector<vector<int>> jm[21];
vector<pair<int,int>> mx;
int csp = 0;
int h,w,q;
void dfs(int i,int j,int s)
{
spp[s].first = min(spp[s].first,i);
spp[s].second = max(spp[s].second,i);
sp[i][j] = s;
if(gr[i][j][0] && sp[i-1][j] == -1)
{
dfs(i-1,j,s);
}
if(gr[i][j][1] && sp[i][j+1] == -1)
{
dfs(i,j+1,s);
}
if(gr[i][j][2] && sp[i+1][j] == -1)
{
dfs(i+1,j,s);
}
if(gr[i][j][3] && sp[i][j-1] == -1)
{
dfs(i,j-1,s);
}
}
vector<int> tr;
void add(int p,int v)
{
p+=h;
tr[p] = v;
p/=2;
while(p > 0)
{
tr[p] = min(tr[p*2],tr[p*2+1]);
p/=2;
}
}
int check(int l,int r)
{
l+=h;
r+=h;
int ans = min(tr[l],tr[r]);
while(l/2 != r/2)
{
if(l%2 == 0) ans = min(ans,tr[l+1]);
if(r%2 == 1) ans = min(ans, tr[r-1]);
l/=2;r/=2;
}
return ans;
}
int main()
{
cin>>h>>w>>q;
gr.resize(h);
sp.resize(h);
for(int i = 0;i<h;i++)
{
sp[i].resize(w);
gr[i].resize(w);
for(int j =0;j<w;j++)
{
sp[i][j] = -1;
gr[i][j].resize(4);
}
}
for(int i =0;i<h;i++)
{
for(int j = 0;j<w-1;j++)
{
char c;
cin>>c;
if(c == '1')
{
gr[i][j][1] = true;
gr[i][j+1][3] = true;
}
}
}
for(int i = 0;i<h-1;i++)
{
for(int j = 0;j<w;j++)
{
char c;
cin>>c;
if(c == '1')
{
gr[i][j][2] = true;
gr[i+1][j][0] =true;
}
}
}
cs.resize(h);
tr.resize(h*2);
for(int i =0;i<h;i++)
{
cin>>cs[i];
add(i,cs[i]);
}
for(int i = 0;i<h;i++)
{
for(int j = 0;j<w;j++)
{
if(sp[i][j] == -1)
{
spp.push_back({i,i});
dfs(i,j,csp);
csp++;
}
}
}
for(int o = 0;o<21;o++)
{
jm[o].resize(csp);
for(int i = 0;i<csp;i++)
{
jm[o][i].resize(3);
}
}
mx.resize(h);
for(int i = 0;i<csp;i++)
{
for(int j = spp[i].first;j<=spp[i].second;j++)
{
if(spp[i].second >= mx[j].first)
{
mx[j].first = spp[i].second;
mx[j].second = i;
}
}
}
for(int i = 0;i<csp;i++)
{
jm[0][i][0] = i;
jm[0][i][1] = i;
jm[0][i][2] = i;
for(int j = spp[i].first;j<=spp[i].second;j++)
{
if(cs[j] == 1)
{
if(spp[jm[0][i][1]].second < mx[j].first)
{
jm[0][i][1] = mx[j].second;
}
}
if(cs[j] == 2)
{
if(spp[jm[0][i][2]].second < mx[j].first)
{
jm[0][i][2] =mx[j].second;
}
}
}
}
//cout<<jm[0][0][1]<<" "<<spp[jm[0][0][1]].first<<" "<<spp[jm[0][0][1]].second;
for(int i = 0;i<csp;i++)
{
if(spp[jm[0][i][2]].second < spp[jm[0][jm[0][i][1]][1]].second)
{
jm[0][i][2] = jm[0][jm[0][i][1]][1];
}
}
for(int o = 1;o<21;o++)
{
for(int i = 0;i<csp;i++)
{
if(spp[jm[o-1][jm[o-1][i][0]][1]].second < spp[jm[o-1][jm[o-1][i][1]][0]].second)
{
jm[o][i][0] = jm[o-1][jm[o-1][i][1]][0];
}
else
{
jm[o][i][0] = jm[o-1][jm[o-1][i][0]][1];
}
if(spp[jm[o-1][jm[o-1][i][2]][0]].second < spp[jm[o-1][jm[o-1][i][1]][1]].second)
{
jm[o][i][1] = jm[o-1][jm[o-1][i][1]][1];
}
else
{
jm[o][i][1] = jm[o-1][jm[o-1][i][2]][0];
}
if(spp[jm[o-1][jm[o-1][i][1]][2]].second < spp[jm[o-1][jm[o-1][i][2]][1]].second)
{
jm[o][i][2] = jm[o-1][jm[o-1][i][2]][1];
}
else
{
jm[o][i][2] = jm[o-1][jm[o-1][i][1]][2];
}
}
}
for(int i = 0;i<q;i++)
{
int t;
cin>>t;
int a,b;
cin>>a>>b;
a--;b--;
int x,y;
cin>>x>>y;
x--;y--;
if(spp[sp[a][b]].first > spp[sp[x][y]].first)
{
swap(a,x);
swap(b,y);
}
if(sp[a][b] == sp[x][y])
{
cout<<0<<"\n";
continue;
}
if(spp[sp[a][b]].second >= spp[sp[x][y]].first)
{
cout<<check(spp[sp[x][y]].first,min(spp[sp[a][b]].second,spp[sp[x][y]].second))<<"\n";
continue;
}
int cu0 =sp[a][b];
int cu = jm[0][cu0][1];
int cu2 = jm[0][cu0][2];
if(spp[cu].second >= spp[sp[x][y]].first)
{
cout<<check(spp[sp[x][y]].first,min(spp[cu].second,spp[sp[x][y]].second))+1<<"\n";
continue;
}
/*if(i == 0)
{
cout<<" A ";
}*/
int ans = 1;
for(int o = 20;o>=0;o--)
{
//cout<<cu<<" "<<spp[cu].first<<" "<<spp[cu].second<<"\n";
//cout<<spp[jm[0][cu2][0]].second<<" "<<spp[jm[0][cu][1]].second<<" "<<spp[sp[x][y]].first<<"\n\n";
if(max(spp[jm[o][cu2][0]].second,spp[jm[o][cu][1]].second) < spp[sp[x][y]].first)
{
int cc = jm[o][cu2][0];
if(spp[jm[o][cu0][1]].second < spp[jm[o][cu][0]].second)
{
cu0 = jm[o][cu][0];
}
else
{
cu0 = jm[o][cu0][1];
}
if(spp[jm[o][cu][2]].second < spp[jm[o][cu2][1]].second)
{
cu2 = jm[o][cu2][1];
}
else
{
cu2 = jm[o][cu][2];
}
if(spp[cc].second < spp[jm[o][cu][1]].second)
{
cu = jm[o][cu][1];
}
else
{
cu = cc;
}
ans+=(1<<o);
}
}
if(spp[jm[0][cu][1]].second < spp[jm[0][cu0][2]].second)
{
cu = jm[0][cu0][2];
}
else
{
cu = jm[0][cu][1];
}
ans++;
if(spp[cu].second < spp[sp[x][y]].first)
{
cout<<-1<<"\n";
continue;
}
cout<<ans+check(spp[sp[x][y]].first,min(spp[cu].second,spp[sp[x][y]].second))<<"\n";
}
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |