122542024-12-10 17:08:35horkaHegyi levegőcpp17Hibás válasz 20/1002.318s166024 KiB
// UUID: 9ed7f0c2-c1b2-4e4a-9c7d-da4b49fec435
#include <bits/stdc++.h>
using namespace std;
const int c=500000,k=20;
int n,m;
int be[c],ki[c],lift_cs[c][k],lift_ert[c][k],fonok[c],mer[c],val[c];
vector<int> adj[c];
int holvan(int x)
{
	return (fonok[x]==x?x:fonok[x]=holvan(fonok[x]));
}
bool lehet=1;
void unio(int a, int b)
{
	lehet=1;
	a=holvan(a),b=holvan(b);
	if(a==b)
	{
		lehet=0;
		return;
	}
	if(mer[a]>mer[b]) swap(a,b);
	mer[b]+=mer[a];
	fonok[a]=b;
}
int ido;
void dfs(int cs, int p)
{
	be[cs]=++ido;
	lift_ert[cs][0]=val[cs];
	lift_cs[cs][0]=p;
	for(int &i:adj[cs])
	{
		if(!be[i]) dfs(i,cs);
	}
	ki[cs]=++ido;
}
bool ose(int a, int b)
{
	if(a==-1) return 1;
	if(be[a]<=be[b] && ki[a]>=ki[b]) return 1;
	return 0;
}
int lca(int a, int b)
{
	if(ose(a,b)) return a;
	if(ose(b,a)) return b;
	for(int j=k-1; j>=0; j--)
	{
		if(!ose(lift_cs[a][j],b)) a=lift_cs[a][j];
	}
	return lift_cs[a][0];
}
int maxi(int a, int x)
{
	//a-rol x-re felmesz mennyi a max el addig
	if(a==x) return lift_ert[a][0];
	int mx=0;
	for(int j=k-1; j>=0; j--)
	{
		if(!ose(lift_cs[a][j],x))
		{
			mx=max(mx,lift_ert[a][j]);
			a=lift_cs[a][j];
		}
	}
	mx=max(mx,lift_ert[a][0]);
	return mx;

}
int main() {
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);		
	cin>>n>>m;
	int q; cin>>q;
	vector<vector<int>> v(n, vector<int> (m)); //n*i+j
	for(int i=0; i<n; i++)
		for(int j=0; j<m; j++)
		{
			cin>>v[i][j];
			val[i*n+j]=v[i][j];
		}
	vector<array<int, 3>> elek;
	for(int i=0; i<n; i++)
		for(int j=0; j<m; j++)
		{
			if(i>0)
			{
				int a=i*n+j,b=(i-1)*n+j;
				int w=max(v[i][j],v[i-1][j]);
				elek.push_back({w,a,b});
			}
			if(j>0)
			{
				int a=i*n+j,b=i*n+j-1;
				int w=max(v[i][j],v[i][j-1]);
				elek.push_back({w,a,b});
			}
		}
	int ossz=n*m;
	for(int i=0; i<ossz; i++)
		mer[i]=1,fonok[i]=i;
	sort(elek.begin(),elek.end());
	for(auto [w,a,b]:elek)
	{
		unio(a,b);
		if(lehet)
		{
			adj[a].push_back(b);
			adj[b].push_back(a);
		}
	}
	dfs(0,-1);
	for(int j=1; j<k; j++)
		for(int i=0; i<ossz; i++)
		{
			if(lift_cs[i][j-1]==-1) lift_cs[i][j]=-1;
			else lift_cs[i][j]=lift_cs[lift_cs[i][j-1]][j-1];
			lift_ert[i][j]=max(lift_ert[i][j-1],(lift_cs[i][j-1]==-1?0:lift_ert[lift_cs[i][j-1]][j-1]));

		}
	while(q--)
	{
		int a,b,c,d; cin>>a>>b>>c>>d;
		a--,b--,c--,d--;
		a=a*n+b;
		b=c*n+d;
		int x=lca(a,b);
		cout<<max(maxi(a,x),maxi(b,x))<<"\n";
	}
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva9ms12088 KiB
2Elfogadva9ms12088 KiB
subtask20/19
3Elfogadva17ms13572 KiB
4Hibás válasz14ms13272 KiB
5Hibás válasz14ms13152 KiB
6Hibás válasz17ms13344 KiB
7Elfogadva17ms13308 KiB
8Hibás válasz14ms13308 KiB
9Futási hiba19ms20848 KiB
10Futási hiba28ms30700 KiB
subtask320/20
11Elfogadva13ms12088 KiB
12Elfogadva14ms12536 KiB
13Elfogadva26ms15120 KiB
14Elfogadva225ms42540 KiB
15Elfogadva1.299s157320 KiB
subtask40/20
16Elfogadva1.299s152748 KiB
17Futási hiba138ms42996 KiB
18Hibás válasz755ms115396 KiB
19Hibás válasz731ms113808 KiB
20Hibás válasz1.014s124040 KiB
subtask50/31
21Futási hiba19ms18932 KiB
22Hibás válasz284ms37304 KiB
23Hibás válasz289ms37428 KiB
24Hibás válasz279ms37496 KiB
25Elfogadva460ms45096 KiB
26Elfogadva335ms39076 KiB
27Elfogadva345ms41552 KiB
28Elfogadva349ms45400 KiB
29Elfogadva287ms41188 KiB
subtask60/10
30Futási hiba54ms39972 KiB
31Hibás válasz1.172s127684 KiB
32Hibás válasz1.064s126092 KiB
33Hibás válasz1.327s136184 KiB
34Elfogadva2.318s165512 KiB
35Hibás válasz1.871s142652 KiB
36Elfogadva1.236s137352 KiB
37Elfogadva1.223s144608 KiB
38Elfogadva1.498s166024 KiB
39Elfogadva1.31s145724 KiB