Cod sursa(job #1829466)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 14 decembrie 2016 23:47:58
Problema Matrice 2 Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#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;
}