預金や預金図の長方形のように、各ノード地区レベル内に格納されているラウンドの数字は、その後、暴力の裁判官は、しかし私は、この考えを持つようになりました。。。このTMは行くことができます。。。それについて考え、あなたが形而上学の時間複雑性は証明できないオーバーできるようになります。。。。
#include <iostreamの> する#include < 文字列・H> の#include <アルゴリズム> する#include <stdio.hに> する#include < 設定 > の#include <ベクトル> の#defineが長い長いLL 使用 名前空間STD。 const int型 MAXX = 2E5 + 6 。 ベクトル < 整数 > V [MAXX * 20 ]。 int型XX [MAXX]。 int型YY [MAXX]。 構造体ノード { int型のL、R。 }ツリー[MAXX * 20 ]。 int型CNT; int型ANS; ブールチェック(int型 ×1、INT Y1、int型 ×2、INT Y2) { リターン 1LLの*(X1-X2)*(X1-X2)+ 1LL *(Y1-Y2)*(Y1-Y2)<1LL * Y1の*のY1 ; } ボイド buildtree(INT&RT、int型の L、int型の R、int型の L、INT R、int型のID) { 場合(!RT) { CNT ++ 。 RT = CNT; } 場合(L <= 1 && R <= R) { V [RT] .push_back(ID)。 返します。 } INT半ば=(L + R)>> 1 。 もし(L <= MID) { buildtree(ツリー[RT] .L、L、中、L、R、ID)。 } もし(R> MID) { buildtree(ツリー[RT] .R、中間 + 1 、R、L、R、ID)。 } } ボイドクエリ(INT RT、INT L、のint R、int型のx、int型Y) { 場合(!RT)のリターン; 用(オートこれ:V [RT]) { もし、((XX [それ]、YY [それ]、x、y)をチェック) { ANS = こと。 返します。 } } 場合(L == r)は { 返します。 } INT半ば=(L + R)>> 1 。 もし(x <= MID) { クエリ(ツリー[RT] .L、L、中、X、Y) } 他 { クエリ(ツリー[RT] .R、中間 + 1 、R、X、Y)。 } } ボイド更新(int型 RT、int型の L、INTR、INT UL、int型 UR、INT ID) { 場合(UL> UR)のリターン; もし(UL <= 1 && R <= UR) { ベクトル < INT > TMP。 用(オートこれ:V [RT]) { 場合(!それ= ID) { tmp.push_back(IT)。 } } V [RT] = TMPと、 返します。 } INT半ば=(L + R)>> 1 。 もし(UL <=MID) { 更新(ツリー[RT] .L、L、中間、UL、UR、ID)。 } であれば(UR> MID) { 更新(ツリー[RT] .R、中間 + 1 、R、UL、UR、ID)。 } } int型のmain() { int型のT、OP。 int型の室温; 一方、(〜のscanf(" %dの"、&T)) { CNT = 0 。 RT = 0 ; 用(int型 iは= 1、I <= T; I ++は) { scanf関数(" %D%D%D "、&OP&XX [i]は、&YY [I])。 もし(OPの== 1 ) { buildtree(RT、 -1e9,1e9、XX [I] -YY [I]、XX [I] + YY [i]は、I)。 } 他 { ANS = - 1 。 クエリ(RT、 - 1e9,1e9、XX [i]は、YY [I])。 printf(" %d個の\ n " 、ANS)。 もし - (!ANS = 1 ) { 更新(RT-1e9,1e9 XX [年] -YY [年] XX [年] + YY [年]歳)。 } } } } 戻り 0 。 }