Problem Description
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!
Input
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).Output
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”.Example Input
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 5Output Yes
No
Yes
Yes
Yes
No不能挨个搜,到第六十个就会Tl;
事先查找每行(i)能按非递减顺序到达的最大行序号b【i】,但是要做一定的优化,就是记住每一列(j)已经按非递减序到达的最大行数c【j】,如果测试这列的时候行数(i)小于这个最大值c【j】,则这个最大值就是i在此列能到达的最大行,再拿它来和原来的最大行做比较,大的赋值给b【i】。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int b[100010]={0},c[100010]={0};
int main()
{
int l,r,row,con,n,k;int i,j;
cin>>row>>con;
int a[row+10][con+10]={0};
for( i=1;i<=row;i++)
for( j=1;j<=con;j++){
cin>>a[i][j];
}
for( i=1;i<=row;i++)
for( j=1;j<=con;++j){
k=i;
if(i<=c[j]) k=c[j];
else
while(a[k][j]<=a[k+1][j]&&k<row) k++;
b[i]=max(b[i],k);//从i行开始以非递减序能到达的最大行序号
c[j]=k;//第j列非递减序到达的最大行号
}
cin>>n;
for(int k=1;k<=n;k++){
cin>>l>>r;
if(b[l]>=r)
cout<<"Yes\n";
else
cout<<"No\n";
}
return 0;
}