76pts求调。
我操你吗的傻子POI出题人父母都是被这狗屎题气死的吗,了字吧不让下数据春额伊哈,,,
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N=2e3+10;
int n,m,a[N][N],up[N][N],st[N],top;
LL s[N][N];
LL sum(int x1,int y1,int x2,int y2){
return s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1];
}
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]),s[i][j]=a[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]>=m&&a[i][j]<=2*m)return printf("%d %d %d %d\n",j,i,j,i),0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]>2*m)up[i][j]=i;
else up[i][j]=up[i-1][j];
for(int i=1;i<=n;i++){
top=0;
for(int j=1;j<=n;j++){
while(top&&up[i][st[top]]<=up[i][j])top--;
int k=st[top]+1,h=up[i][j]+1;
st[++top]=j;
assert(k==1||up[i][k-1]>up[i][j]);
if(sum(h,k,i,j)<m)continue;
while(sum(h,k,i,j)>2*m){
if(sum(h,k,h,j)>=m){
while(sum(h,k,h,j)>2*m)k++;
printf("%d %d %d %d\n",k,h,j,h);
return 0;
}
h++;
}
printf("%d %d %d %d\n",k,h,j,i);
return 0;
}
}
puts("NIE");
return 0;
}