标签:color signed 查询 put rmi lin turn dex math
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <complex>
using namespace std;
typedef long long LL;
const int MAXN = 811;
const int MAXM = 5000011;
int n,m,ju[MAXN][MAXN],X[2],Y[2],cnt,rt,ans,CC;
struct node{ int l,r,ls,rs,maxl,minl,tree; }a[MAXM];
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<‘0‘||c>‘9‘) && c!=‘-‘) c=getchar();
if(c==‘-‘) q=1,c=getchar(); while (c>=‘0‘&&c<=‘9‘) w=w*10+c-‘0‘,c=getchar(); return q?-w:w;
}
namespace Seg_tree{
inline void build(int &k,int l,int r,int bel){
k=++cnt; a[k].l=l; a[k].r=r; if(l==r) { a[k].minl=a[k].maxl=ju[l][bel]; return ; }
int mid=(l+r)>>1; build(a[k].ls,l,mid,bel); build(a[k].rs,mid+1,r,bel);
a[k].minl=min(a[a[k].ls].minl,a[a[k].rs].minl); a[k].maxl=max(a[a[k].ls].maxl,a[a[k].rs].maxl);
}
inline int query_min(int k,int l,int r){
if(Y[0]<=l && r<=Y[1]) return a[k].minl;
int mid=(l+r)>>1;
if(Y[0]>mid) return query_min(a[k].rs,mid+1,r);
else if(Y[1]<=mid) return query_min(a[k].ls,l,mid);
else return min(query_min(a[k].ls,l,mid),query_min(a[k].rs,mid+1,r));
}
inline int query_max(int k,int l,int r){
if(Y[0]<=l && r<=Y[1]) return a[k].maxl;
int mid=(l+r)>>1;
if(Y[0]>mid) return query_max(a[k].rs,mid+1,r);
else if(Y[1]<=mid) return query_max(a[k].ls,l,mid);
else return max(query_max(a[k].ls,l,mid),query_max(a[k].rs,mid+1,r));
}
inline void modify(int k,int l,int r,int y){
if(l==r) { a[k].minl=a[k].maxl=ans; return ; }
int mid=(l+r)>>1;
if(y<=mid) modify(a[k].ls,l,mid,y); else modify(a[k].rs,mid+1,r,y);
a[k].minl=min(a[a[k].ls].minl,a[a[k].rs].minl); a[k].maxl=max(a[a[k].ls].maxl,a[a[k].rs].maxl);
}
inline void update_min(int k,int l,int r,int y){
if(l==r) { a[k].minl=CC; return ; }
int mid=(l+r)>>1;
if(y<=mid) update_min(a[k].ls,l,mid,y); else update_min(a[k].rs,mid+1,r,y);
a[k].minl=min(a[a[k].ls].minl,a[a[k].rs].minl);
}
inline void update_max(int k,int l,int r,int y){
if(l==r) { a[k].maxl=CC; return ; }
int mid=(l+r)>>1;
if(y<=mid) update_max(a[k].ls,l,mid,y); else update_max(a[k].rs,mid+1,r,y);
a[k].maxl=max(a[a[k].ls].maxl,a[a[k].rs].maxl);
}
}
inline void merge(int &k,node q,node qq){
if(!k) k=++cnt; a[k].maxl=max(q.maxl,qq.maxl); a[k].minl=min(q.minl,qq.minl);
a[k].l=q.l; a[k].r=q.r; if(q.l==q.r) return ;
merge(a[k].ls,a[q.ls],a[qq.ls]);
merge(a[k].rs,a[q.rs],a[qq.rs]);
}
inline void build(int &k,int l,int r){
k=++cnt; a[k].l=l; a[k].r=r;
if(l==r) {
Seg_tree::build(a[k].tree,1,n,l);
return;
}
int mid=(l+r)>>1; build(a[k].ls,l,mid); build(a[k].rs,mid+1,r);
merge(a[k].tree,a[ a[a[k].ls].tree ],a[ a[a[k].rs].tree ]);
}
inline int query_min(int k,int l,int r){
if(X[0]<=l && r<=X[1]) return Seg_tree::query_min(a[k].tree,1,n);
int mid=(l+r)>>1;
if(X[0]>mid) return query_min(a[k].rs,mid+1,r);
else if(X[1]<=mid) return query_min(a[k].ls,l,mid);
else return min(query_min(a[k].ls,l,mid),query_min(a[k].rs,mid+1,r));
}
inline int query_max(int k,int l,int r){
if(X[0]<=l && r<=X[1]) return Seg_tree::query_max(a[k].tree,1,n);
int mid=(l+r)>>1;
if(X[0]>mid) return query_max(a[k].rs,mid+1,r);
else if(X[1]<=mid) return query_max(a[k].ls,l,mid);
else return max(query_max(a[k].ls,l,mid),query_max(a[k].rs,mid+1,r));
}
inline void modify(int k,int l,int r,int x,int y){
if(l==r) { Seg_tree::modify(a[k].tree,1,n,y); return ; }
int mid=(l+r)>>1;
if(x<=mid) modify(a[k].ls,l,mid,x,y);
else modify(a[k].rs,mid+1,r,x,y);
int lc=a[k].ls,rc=a[k].rs;
int lmin=Seg_tree::query_min(a[lc].tree,a[a[lc].tree].l,a[a[lc].tree].r);
int rmin=Seg_tree::query_min(a[rc].tree,a[a[rc].tree].l,a[a[rc].tree].r);
CC=min(lmin,rmin); Seg_tree::update_min(a[k].tree,a[a[k].tree].l,a[a[k].tree].r,y);
int lmax=Seg_tree::query_max(a[lc].tree,a[a[lc].tree].l,a[a[lc].tree].r);
int rmax=Seg_tree::query_max(a[rc].tree,a[a[rc].tree].l,a[a[rc].tree].r);
CC=max(lmax,rmax); Seg_tree::update_max(a[k].tree,a[a[k].tree].l,a[a[k].tree].r,y);
//merge(a[k].tree,a[ a[a[k].ls].tree ],a[ a[a[k].rs].tree ]);
}
inline void work(){
int T=getint();
for(int Case=1;Case<=T;Case++) {
printf("Case #%d:\n",Case); n=getint(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) ju[i][j]=getint();
for(int i=1;i<=cnt;i++) a[i].tree=a[i].ls=a[i].rs=0; cnt=0; rt=0;
build(rt,1,n); m=getint(); int x,y,z,da,xiao;
while(m--) {
y=getint(); x=getint(); z=getint(); z>>=1;
X[0]=max(x-z,1); X[1]=min(x+z,n);
Y[0]=max(y-z,1); Y[1]=min(y+z,n);
da=query_max(rt,1,n);
xiao=query_min(rt,1,n);
ans=(da+xiao)>>1; printf("%d\n",ans);
Y[0]=Y[1]=y;
modify(rt,1,n,x,y);
}
}
}
int main()
{
work();
return 0;
}
标签:color signed 查询 put rmi lin turn dex math
原文地址:http://www.cnblogs.com/ljh2000-jump/p/6413532.html