During the lesson small girl Alyona works with one famous spreadsheet computer program and learns how to edit tables.
Now she has a table filled with integers. The table consists of n rows and m columns. By ai, j we will denote the integer located at the i-th row and the j-th column. We say that the table is sorted in non-decreasing order in the column j if ai, j ≤ ai + 1, j for all i from 1 to n - 1.
Teacher gave Alyona k tasks. For each of the tasks two integers l and r are given and Alyona has to answer the following question: if one keeps the rows from l to r inclusive and deletes all others, will the table be sorted in non-decreasing order in at least one column? Formally, does there exist such j that ai, j ≤ ai + 1, j for all i from l to r - 1 inclusive.
Alyona is too small to deal with this task and asks you to help!
The first line of the input contains two positive integers n and m (1 ≤ n·m ≤ 100 000) — the number of rows and the number of columns in the table respectively. Note that your are given a constraint that bound the product of these two integers, i.e. the number of elements in the table.
Each of the following n lines contains m integers. The j-th integers in the i of these lines stands for ai, j (1 ≤ ai, j ≤ 109).
The next line of the input contains an integer k (1 ≤ k ≤ 100 000) — the number of task that teacher gave to Alyona.
The i-th of the next k lines contains two integers li and ri (1 ≤ li ≤ ri ≤ n).
Print "Yes" to the i-th line of the output if the table consisting of rows from li to ri inclusive is sorted in non-decreasing order in at least one column. Otherwise, print "No".
5 4 1 2 3 5 3 1 3 2 4 5 2 3 5 5 3 2 4 4 3 4 6 1 1 2 5 4 5 3 5 1 3 1 5
Yes No Yes Yes Yes No
感觉算法没有任何问题,不知道为什么一直wa一直wa结果发现映射的时候写错了!!!!!
i*m+j让我写成了i*n+j啊啊啊啊啊啊 然后示例却毫无压力的过了QAQ QAQ(泪奔)
思路:预处理,每次处理出当前格子能向前最远到达的位置。
之后更新出每一行能最远到达的位置。
询问时,只要当前行最远到达的位置<=l便表示存在,否则不存在。
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+7;
int tu[MAXN];
int ans[MAXN];//记录每个格子最远能到达的位置
int MAX[MAXN];//记录每一行能最远到达的位置
int n,m;
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
for(i=0; i<n; ++i)
for(j=0; j<m; ++j)scanf("%d",&tu[i*m+j]);
for(j=0; j<m; ++j)
{
for(i=0; i<n; ++i)
{
if(!i)ans[i*m+j]=0;
else
{
if(tu[i*m+j]>=tu[(i-1)*m+j])ans[i*m+j]=ans[(i-1)*m+j];
else ans[i*m+j]=i;
}
}
}
for(i=0; i<n; ++i)
{
MAX[i]=1e9;
for(j=0; j<m; ++j)
{
//printf("%d ",ans[i*n+j]);
MAX[i]=min(MAX[i],ans[i*m+j]);
}
//puts("");
}
scanf("%d",&k);
int l,r;
while(k--)
{
scanf("%d%d",&l,&r);
l--;
r--;
if(MAX[r]<=l)
{
puts("Yes");
}
else puts("No");
}
return 0;
}