書式#include <iostreamの> 書式#include <stdio.hに> する#include < 文字列の.h> の#include <アルゴリズム> 書式#include <ベクトル> の#define LL長い長い 使って 名前空間はstdを、 const int型 MAXX = 1E5 + 10 。 構造体ノード{ int型のL、R。 LLのワット。 }ツリー[MAXX * 40 ]。 int型のルート[MAXX]。 構造体ノード{ int型のX、Y。 LLのワット。 ブール 演算子 <(constのノード&S)CONST{ 戻り X < SX。 } } [MAXX]を指します。 ベクトル < int型 > VX; ベクトル < int型 > VY。 LLのn; int型のCNT; LL get_val(LLのX、LLのY){ LLのK =分(X、分(N-X + 1、分(Y、N-Y + 1 )))。 LLミネソタ州 = K。 K - ; LL における = N- 2 * K。 LL アウト = N * N- 中 * で。 もし(x == N-ミネソタ+ 1){ 戻り OUT + NK-Y + 1 ; } そう IF Y ==()ミネソタ州{ 戻り OUT +の中 + NK- X; } そう IF(X == ミネソタ州){ 戻り OUT + に * 2 - 2 + Y- K; } 他{ 戻り OUT +の中 * 3 - 3。 + X- K; } } /// / Y半順序社長ツリーメンテナンス間隔と ボイドインサート(int型 L、int型の R、int型プリ、INT&今、int型のPOS、LLのW){ 今 = ++ CNT。 ツリー[今] = ツリー[事前]。 ツリー[今] .W + = W。 もし(L == R){ リターン。 } INT半ば=(L + R)>> 1 。 もし(POS <= MID)インサート(L、中間、ツリー[事前] .L、ツリー[今] .L、POS、W)。 他のインサート(MID + 1 、R、ツリー[事前] .R、ツリー[今] .R、POS、W)。 } LLクエリ(int型 L、INT R、int型の L、INT R、INT QL、INT QR){ // 区间查询 場合(QL <= L && R <= QR){ 戻りツリー[R] .w- ツリー[L] .W。 } INT半ば=(L + R)>> 1 。 LL ANS = 0 。 もし(QR <= MID){ 戻りクエリ(ツリー[L] .L、ツリー[R] .L、L、中間、QL、QR)。 } そう であれば(QL> MID){ 戻りクエリ(ツリー[L] .R、ツリー[R] .R、中間+ 1 、R、QL、QR)。 } 他{ 戻りクエリ(ツリー[L] .L、ツリー[R] .L、L、中間、QL、QR)+クエリ(ツリー[L] .R、ツリー[R] .R、中間+ 1 、R、QL、QR ); } } LL CAL(LL X){ LL和 = 0 。 一方、(X) の和 + = X%10、X / = 10 。 戻り値の合計。 } int型のmain(){ int型のT。 int型M、P。 scanf関数(" %のD "、&T)。 一方、(T-- ){ CNT = 0 。 memsetの(根、0、sizeof (ルート))。 memset(木、0、はsizeof (木))。 scanf関数(" %LLD%D%D "、&N、&M、&P); vx.clear(); vy.clear(); 以下のために(int型私= 1 ; I <= M; iが++ ){ scanf関数(" %d個の%のD "、&ポイント[I] .X、&ポイント[I] .Y)。 点[i]は.W = CAL(get_val(点[I] .X、ポイント[I] .Y))。 vx.push_back(点[I] .X)。 vy.push_back(点[I] .Y)。 } ソート(点 + 1、点+ 1+ )mは、 ソート(vx.begin()、vx.end()); ソート(vy.begin()、vy.end()); vy.erase(ユニーク(vy.begin()、vy.end())、vy.end())。 INT SZ = vy.size()。 以下のために(int型 I = 1 ; I <= M; iは++ ){ int型 POSY = LOWER_BOUND(vy.begin()、vy.end()、点[i]は.Y)-vy.begin()+ 1 。 インサート(1、SZ、ルート[I- 1 ]、根[i]は、POSY、ポイント[I] .W)。 } 一方(P-- ){ int型LX、RX、LY、RY。 scanf関数(" %D%D%D%D "、&LX、LY&、&RX、& RY)。 LX = LOWER_BOUND(vx.begin()、vx.end()、LX)-vx.begin()+ 1 。 RX = UPPER_BOUND(vx.begin()、vx.end()、RX) - vx.begin()。 LY = LOWER_BOUND(vy.begin()、vy.end()、LY)-vy.begin()+ 1 。 RY = UPPER_BOUND(vy.begin()、vy.end()、RY) - vy.begin()。 もし(LX> RX || LY> RY){ のprintf(" 0 \ n " ); 続け; } のprintf(" %LLDする\ n "、クエリ(根[lx- 1 ]、根[RX]、1 、SZ、LY、RY))。 } } リターン 0 ; } / * * /