Pagini recente » Cod sursa (job #1951498) | Cod sursa (job #2316642) | Cod sursa (job #2634584) | Cod sursa (job #2293374) | Cod sursa (job #1829466)
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cstring>
#include <map>
#include <iomanip>
//#include <unordered_map>
#include <stack>
#include <bitset>
#include <cctype>
#define MOD 8192
#define pb push_back
#define INF 0x3f3f3f3f
#define INFLL (1LL*INF*INF)
#define ll long long
#define NMAX 305
#define QMAX 10005
using namespace std;
typedef pair<int, int> pii;
ifstream fin("matrice2.in");
ofstream fout("matrice2.out");
struct query{
int x1,y1,x2,y2,val,pos;
} op[QMAX];
struct matrice {
int x,y,val,indice;
} v[NMAX*NMAX];
int res[QMAX],p[NMAX*NMAX],pos[NMAX][NMAX];
int dlin[4]={0,1,0,-1};
int dcol[4]={1,0,-1,0};
bool compmatrice(matrice A, matrice B) {
return A.val>B.val;
}
bool compquery(query A, query B) {
return A.val>B.val;
}
inline int findSet(int x) {
if(p[x]==x) return x;
return p[x]=findSet(p[x]);
}
inline void unionSet(int x1, int y1, int x2, int y2) {
int x=findSet(pos[x1][y1]);
int y=findSet(pos[x2][y2]);
p[x]=y;
}
int main() {
int n,i,j,nr=0,q,k,newx,newy,x,y,jeg;
fin>>n>>q;
for(i=1;i<=n;++i) {
for(j=1;j<=n;++j) {
fin>>v[++nr].val;
v[nr].x=i;
v[nr].y=j;
v[nr].indice=nr;
}
}
for(i=1;i<=q;++i) {
fin>>op[i].x1>>op[i].y1>>op[i].x2>>op[i].y2;
op[i].pos=i;
}
sort(v+1,v+nr+1,compmatrice);
for(i=1;i<=nr;++i) pos[v[i].x][v[i].y]=i;
for(i=(1<<20);i>0;i>>=1) {
sort(op+1,op+q+1,compquery);
for(j=1;j<=nr;++j) p[j]=j;
k=1;
for(j=1;j<=q;++j) {
while(op[j].val+i<=v[k].val) {
x=v[k].x;
y=v[k].y;
for(jeg=0;jeg<4;++jeg) {
newx=x+dlin[jeg];
newy=y+dcol[jeg];
if(v[pos[newx][newy]].val>=v[pos[x][y]].val)
unionSet(x,y,newx,newy);
}
++k;
}
if(findSet(pos[op[j].x1][op[j].y1])==findSet(pos[op[j].x2][op[j].y2]))
op[j].val+=i;
}
}
for(i=1;i<=q;++i) res[op[i].pos]=op[i].val;
for(i=1;i<=q;++i) fout<<res[i]<<'\n';
return 0;
}