Codeforces D. Monitor
二维线段树模板:
///#include<bits/stdc++.h>
///#include<unordered_map>
///#include<unordered_set>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<set>
#include<stack>
#include<map>
#include<new>
#include<vector>
#define MT(a,b) memset(a,b,sizeof(a));
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const double E=2.718281828459;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
#define son1(x) (x<<2)-2
#define son2(x) (x<<2)-1
#define son3(x) (x<<2)
#define son4(x) (x<<2)+1
#define sum1(x) root[son1(x)].sum
#define sum2(x) root[son2(x)].sum
#define sum3(x) root[son3(x)].sum
#define sum4(x) root[son4(x)].sum
int n,m,k,q;
int maps[510][510];
struct node
{
int x1,y1,x2,y2,s1,s2,s3,s4,sum;
}root[2000005];
void buildroot(int sign,int sx,int sy,int dx,int dy)
{
if(sx==dx&&sy==dy) ///只有一点
root[sign]=node{sx,sy,dx,dy,-1,-1,-1,-1,maps[sx][sy]};
else if(sy==dy) ///只有一列
{
int midx=sx+dx>>1;
buildroot(son1(sign),sx,sy,midx,dy);
buildroot(son3(sign),midx+1,dy,dx,dy);
root[sign]=node{sx,sy,dx,dy,son1(sign),-1,son3(sign),-1,max(sum1(sign),sum3(sign))};
}
else if(sx==dx) ///只有一行
{
int midy=sy+dy>>1;
buildroot(son1(sign),sx,sy,sx,midy);
buildroot(son2(sign),sx,midy+1,sx,dy);
root[sign]=node{sx,sy,dx,dy,son1(sign),son2(sign),-1,-1,max(sum1(sign),sum2(sign))};
}
else ///含有四个son
{
int midx=sx+dx>>1,midy=sy+dy>>1;
buildroot(son1(sign),sx,sy,midx,midy);
buildroot(son2(sign),sx,midy+1,midx,dy);
buildroot(son3(sign),midx+1,sy,dx,midy);
buildroot(son4(sign),midx+1,midy+1,dx,dy);
int maxn=-1;
maxn=max(maxn,max(sum1(sign),sum3(sign)));
maxn=max(maxn,max(sum2(sign),sum4(sign)));
root[sign]=node{sx,sy,dx,dy,son1(sign),son2(sign),son3(sign),son4(sign),maxn};
}
}
int findroot(int sign,int sx,int sy,int dx,int dy) ///查询矩形值
{
if(sign==-1) return -1;
if(sx<=root[sign].x1&&root[sign].x2<=dx&&sy<=root[sign].y1&&root[sign].y2<=dy)
return root[sign].sum;
if(root[sign].x1>dx||root[sign].y1>dy||root[sign].x2<sx||root[sign].y2<sy)
return -1;
int maxn=-1;
maxn=max(maxn,max(findroot(son1(sign),sx,sy,dx,dy),findroot(son2(sign),sx,sy,dx,dy)));
maxn=max(maxn,max(findroot(son3(sign),sx,sy,dx,dy),findroot(son4(sign),sx,sy,dx,dy)));
return maxn;
}
int main()
{
scanf("%d %d %d %d",&n,&m,&k,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
maps[i][j]=mod;
while(q--)
{
int x,y,t;
scanf("%d %d %d",&x,&y,&t);
maps[x][y]=t;
}
buildroot(1,1,1,n,m);
int t=mod;
for(int i=1;i<=n-k+1;i++)
{
for(int j=1;j<=m-k+1;j++)
{
int x=i+k-1,y=j+k-1;
int m=findroot(1,i,j,x,y);
if(m==mod) continue;
else t=min(t,m);
}
}
if(t==mod)
printf("-1\n");
else
printf("%d\n",t);
return 0;
}