63 pts.
WA on #2 #4 #10 #11
恳请大佬进来捉虫!!!
代码如下,可读性较好。
#include<cctype>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#define rit register int
#define ric register char
using namespace std;
const int maxz=600010;
inline int maxt(rit x,rit y){
return (x>y)?(x):(y);
}
inline int mint(rit x,rit y){
return (x<y)?(x):(y);
}
int n,m;
int ans[maxz],tot=0,lx=0,ly=0;
struct operate{
int x,y,to;bool type;//true->add point / false->query
bool operator < (operate tp){
if(this->x==tp.x){
if(this->y==tp.y)return (this->type&&(!tp.type));
return this->y<tp.y;
}
return this->x<tp.x;
}
}op[maxz],use[maxz],help[maxz];
struct binary_index_tree{
int bas[1000010];
int posq[maxz],top;
inline void init(){
memset(bas,0,sizeof(bas));
top=0;
}
inline int getmax(int r){
int res=0;
for(rit pos=r;pos;pos^=(pos&(-pos)) ){
res=maxt(bas[pos],res);
}
return res;
}
inline void insert(int pos,int val){
posq[++top]=pos;
for(;pos<=1000000;pos+=(pos&(-pos)) ){
bas[pos]=maxt(bas[pos],val);
}
}
inline void erase(){
while(top){
for(rit pos=posq[top];pos<=1000000;pos+=(pos&(-pos)) ){
if(!bas[pos])break;
else bas[pos]=0;
}
top--;
}
}
}bit;
inline int in(){
rit val=0,sig=1;ric c=getchar();
while(!isdigit(c)){if(c=='-')sig=-1;c=getchar();}
while( isdigit(c))val=((val<<3)+(val<<1)+(c^48)),c=getchar();
return val*sig;
}
inline void cdq(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
cdq(l,mid);cdq(mid+1,r);
rit lh=l;rit rh=mid+1;
for(rit i=l;i<=r;++i){
if(lh<=mid&&rh<=r){
if(use[lh]<use[rh]){
help[i]=use[lh];
if(use[lh].type){
bit.insert(use[lh].y,use[lh].x+use[lh].y);
}++lh;
}
else{
help[i]=use[rh];
if(!use[rh].type){
ans[use[rh].to]=mint(ans[use[rh].to],use[rh].x+use[rh].y-bit.getmax(use[rh].y));
}++rh;
}
}
else if(lh>mid){
help[i]=use[rh];
if(!use[rh].type){
ans[use[rh].to]=mint(ans[use[rh].to],use[rh].x+use[rh].y-bit.getmax(use[rh].y));
}++rh;
}
else{
help[i]=use[lh];
if(use[lh].type){
bit.insert(use[lh].y,use[lh].x+use[lh].y);
}++lh;
}
}
for(rit i=l;i<=r;++i){
use[i]=help[i];
}
bit.erase();
}
int main(){
//freopen("P4169_2.in","r",stdin);
//freopen("P4169_2.ans","w",stdout);
bit.init();
n=in();m=in();
for(rit i=1;i<=n;++i){
op[i].x=in()+1;op[i].y=in()+1;op[i].type=true;
lx=maxt(lx,op[i].x);ly=maxt(ly,op[i].y);
use[i]=op[i];
}
rit pos;
for(rit i=1;i<=m;++i){
pos=n+i;
op[pos].type=(in()&1);op[pos].x=in()+1;op[pos].y=in()+1;
if(!op[pos].type)op[pos].to=++tot;
lx=maxt(lx,op[pos].x);ly=maxt(ly,op[pos].y);
use[pos]=op[pos];
}
memset(ans,0x3f,sizeof(ans));++lx,++ly;
cdq(1,n+m);
for(rit i=1;i<=n+m;++i){
use[i]=op[i];use[i].x=lx-use[i].x;
}cdq(1,n+m);
for(rit i=1;i<=n+m;++i){
use[i]=op[i];use[i].y=ly-use[i].y;
}cdq(1,n+m);
for(rit i=1;i<=n+m;++i){
use[i]=op[i];use[i].x=lx-use[i].x;use[i].y=ly-use[i].y;
}cdq(1,n+m);
for(rit i=1;i<=tot;++i){
printf("%d\n",ans[i]);
}
return 0;
}