Submission #1158612

#TimeUsernameProblemLanguageResultExecution timeMemory
1158612alexander707070Furniture (JOI20_furniture)C++20
0 / 100
1 ms836 KiB
#include<bits/stdc++.h>
#define MAXN 1007
using namespace std;

int n,m,x,y,qs;
int t[MAXN][MAXN];
bool vis[MAXN][MAXN];

int parent[MAXN*MAXN];
bool ans[MAXN*MAXN];

int val(int x){
	return t[(x-1)/m+1][(x-1)%m+1];
}

int coor(int x,int y){
	return (x-1)*m+y;
}

bool bigger(int a,int b){
	if(val(a)==0)a=parent[a];
	if(val(b)==0)b=parent[b];

	vector<int> l,r;

	while(a!=1){
		l.push_back(val(a));
		a=parent[a];
	}

	while(b!=1){
		r.push_back(val(b));
		b=parent[b];
	}

	while(!l.empty() and !r.empty() and l.back()==r.back()){
		l.pop_back();
		r.pop_back();
	}

	if(l.empty() or (!r.empty() and l.back()>r.back()))return true;
	return false;
}

void recur(int x){
	while(x!=1){
		ans[val(x)]=false;
		x=parent[x];
	}
}

int main(){

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin>>n>>m;

	for(int i=1;i<=n;i++){
		for(int f=1;f<=m;f++){
			cin>>t[i][f];
			t[i][f]=-t[i][f];
		}
	}

	cin>>qs;
	for(int i=1;i<=qs;i++){
		cin>>x>>y;
		t[x][y]=i;
		ans[i]=true;
	}

	for(int i=1;i<=n;i++){
		for(int f=1;f<=m;f++){
			
			if(i==1 and f==1){
				parent[1]=1;
				continue;
			}
			
			if(t[i][f]==-1)continue;

			if((i==1 or parent[coor(i-1,f)]==0) and (f==1 or parent[coor(i,f-1)]==0))continue;

			if(i==1 or parent[coor(i-1,f)]==0){
				if(t[i][f-1]==0)parent[coor(i,f)]=parent[coor(i,f-1)];
				else parent[coor(i,f)]=coor(i,f-1);
				continue;
			}

			if(f==1 or parent[coor(i,f-1)]==0){
				if(t[i-1][f]==0)parent[coor(i,f)]=parent[coor(i-1,f)];
				else parent[coor(i,f)]=coor(i-1,f);
				continue;
			}

			if(bigger( coor(i-1,f) , coor(i,f-1) )){
				if(t[i-1][f]==0)parent[coor(i,f)]=parent[coor(i-1,f)];
				else parent[coor(i,f)]=coor(i-1,f);
			}else{
				if(t[i][f-1]==0)parent[coor(i,f)]=parent[coor(i,f-1)];
				else parent[coor(i,f)]=coor(i,f-1);
			}
		}
	}

	recur(coor(n,m));

	for(int i=1;i<=qs;i++){
		cout<<ans[i]<<"\n";
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...