解決
大規模な座標範囲を見つけ、離散を考えます
まだ離散2次元データ構造を使用することはできません。しかし、その後、配列のサイズが大きすぎます
見つかった変更なし、クエリのみ
x座標は徐々に増加することが考えられる場合には、Yのみが情報記録を座標
クエリは、次に、左下隅の問い合わせのために(0,0)に4分割し、その後順次要約を計算します
座標と、アレイ内の各インタロゲーションツリーの座標、yは離散座標
プレスは、x x座標に等しい、バック依頼の前に大きな木に小さな座標
それは、そのツリーを打ったときアレイを介して、アレイは、y座標プラス1
照会要求ツリーアレイは、より少ないヒットとにy座標場合
コード
書式#include <cstdioを> する#include <cstdlib> 書式#include <アルゴリズム> 使用して 名前空間をSTD。 CONST INT N = 3E6 + 10 。 INTのTR [N]、N、M、CNT、A、B、C、D、ANS [N]、TOT。 構造体ノード { int型のx、ID。 ブール 演算子 <(constのノード&O)のconst { リターン X < OX。 } } [N]。 構造体のモード { int型のX、Y、ID、INV。 ブール 演算子 <(CONSTモード&O)CONST { 戻り X == OX ID <o.id:x <?OX。 } } D [N]。 INT lowbit(INT X) { 戻り X&( - X)。 } INT GET(int型X) { int型 ANS = 0 。 用(; X; X- = lowbit(X))ANS + = TR [X]。 戻り値は、ANS; } ボイド追加(int型X) { ため(; X <= CNT; X + = lowbit(X))TR [X] ++ ; } int型のmain() { scanf関数(" %D%D "、&N、&M)。 以下のために(INT iが= 1 ; <I = N; I ++ ) { TOT ++ 。 scanf関数(" %D%D "、&D [TOT] .X、&D [TOT] .Y)。 D [TOT] .X ++、D [TOT] .Y ++ 。 D [TOT] .ID = 0 。 } のための(INT iは= 1 ; I <= M I ++ ) { scanf関数(" %D%D%D%D "、&A、&B、&C&D)。++、B ++、C ++、D ++ 。 D [全て++] =(モード){A- 1、B- 1、及び1 }。 D [ ++すべて] =(モード){C、D、および1 }。 D [ ++すべて] =(モード){A- 1、D、および- 1 }。 D [ ++すべて] =(モード){C、B- 1及び- 1 }。 } の場合(INT iは= 1 ; I <=全てのi ++ ) [I] .X = D [i]を.Yで[I] .ID = iは、 幸いにも( + 1、+ 1 + すべて); 以下のために(int型私は= 1 ; I <=すべて;私++) { もし(I == 1!|| [I] .X = [I- 1 ] .X)CNT ++ 。 D [i]は.ID] .Y = CNT。 } ソート(D + 1、D + 1回の + TOT)。 以下のために(INT iが= 1 ; I <= TOT; I ++ ) { 場合(D [i]が.ID)[D [i]は.ID] + = DをANS [I] .inv * 得る(D [i]は.Y ); 他のアドオン(D [i]の.Y)。 } のための(INT iは= 1のprintf(; I <= M I ++)" は%d \ n " 、ANS [I])。 リターン 0 ; }