题意:给了你两个数代表两行,让你从所有列中找是否满足这两行之间的所有数非递减
思路:首先用vector存数据,然后直接暴力k次询问肯定会超时,我们记录一下每一行按非递减顺序能到达的最大位置,如果它们之间包含了给的两个数的范围就输出Yes,否则输出No
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 100010;
vector<int>vec[N];
int res[N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
int x;
scanf("%d",&x);
vec[i].push_back(x);
}
}
memset(res,0,sizeof(res));
for(int j = 0; j < m; j++)
{
for(int i = 0; i < n; )
{
int flag = i;
while(flag + 1 < n && vec[flag][j] <= vec[flag + 1][j])
{
flag++;
}
for(int k = i; k <= flag; k++)
res[k] = max(res[k],flag);
i = flag + 1;
}
}
// for(int i = 0; i < n; i++)
// printf("%d\n",res[i]);
int q;
scanf("%d",&q);
while(q--)
{
int l,r;
scanf("%d%d",&l,&r);
l--;
r--;
if(res[l] >= r)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}