1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <cstdlib> 5の#include <cmath> 6の#include <アルゴリズム> 7の#include <CTIME> 8の#include <両端キュー> 9 使用 名前空間はstd; 10 CONST 長い 長 N = 2000005 。 11 長い 長N、M、X1、Y11、X2、Y2、T。 12 構造体ツリー{ 13 長い 長L、R、A、B、C。 14 }ツリー[ 4 * N]。 15 ボイドビルド(長い 長い O、長い 長 L、長い 長いR){ 16 ツリー[O] .A =ツリー[O] .B =ツリー[O] .C = 0 。 17 ツリー[O] .L = L。 18 ツリー[O] .R = R。 19 であれば(L == R){ 20 リターン。 21 } 22 長い 長い半ば=(L + R)を/ 2 。 23 ビルド(入出力* 2 、L、MID)。 24 ビルド(O * 2 + 1、ミッド+ 1、R)。 25 } 26 空隙押下(長 ロングO){ 27 ツリー[* O 2 .A + =] ツリー[O] .A。 28 ツリー[* O 2 .B + =] ツリー[O] .B。 29 ツリー[* O 2 .C + =] ツリー[O] .C。 30 ツリー[O * 2 + 1 ] .A + = ツリー[O] .A。 31 ツリー[O * 2 + 1 ] .B + = ツリー[O] .B。 32 ツリー[O * 2 + 1 ] + .C = ツリー[O] .C。 33 ツリー[O] .A =ツリー[O] .B =ツリー[O] .C = 0 。 34 } 35 長い 長いクエリ(長い 長い O、長い 長K){ 36 長い 長 L =ツリー[O] .L、R = ツリー[O] .R。 37 であれば(L == R){ 38 リターン K * K *のツリー[O] .A + k個の*ツリー[O] .B + ツリー[O] .C。 39 } 40 長い 長い半ば=(L + R)を/ 2 。 41 プッシュダウン(O) 42 もし(K <= MID){ 43 リターンクエリ(O * 2、K)。 44 } 45 他{ 46 リターンクエリ(O * 2 + 1 、K); 47 } 48 } 49 空隙更新(長い 長い O、長い 長 QL、長い 長い QR、長い 長い、長い 長い B、長い 長いC){ 50 長い 長 L =ツリー[O] .L、R = Oツリー[ ] .R。 51 であれば(QL <= L && R <= QR){ 52 ツリー[O] .A + =A; 53 ツリー[O] .B + = B。 54 ツリー[O] + .C = C。 55 リターン; 56 } 57 長い 長い半ば=(L + R)を/ 2 。 58 であれば(QL <= MID){ 59 更新(O * 2 、QL、QR、A、B、C)。 60 } 61 であれば(QR> MID){ 62 更新(O * 2 + 1 、QL、QR、A、B、C)。 63 } 64 } 65 INT メイン(){ 66 のscanf(" %のLLDの%のLLD "、&N、&M)。 67 ビルド(1、1、200000 ); 68 のための(長い 長 i = 1 ; iが<= N iが++ ){ 69 のscanf(" %LLD%LLD%LLD%LLD "、&X1、&Y11、&X2、&Y2)。 70 更新(1、最大値(X2、Y2)+ 1、200000、0、0、(X2-X1)*(Y2- Y11))。 71 であれば(X2 < Y2){ 72 更新(1、最大値(X2、Y11)+ 1、Y2、0、X2-X1、Y11の*(X1- ×2)); 73 } 74 他{ 75 更新(1、MAX(X1、Y2)+ 1、X 2、0、Y2-Y11、X1×(y11- Y2))。 76 } 77 であれば(MAX(X1、Y11)< 分(X2、Y2)){ 78 更新(1、MAX(X1、Y11)、分(X2、Y2)、1、 - (×1 +のY11)、X1 * Y11); 79 } 80 } 81 のための(長い 長い I = 1; I <= M; iは++ ){ 82 のscanf(" %のLLD "、&T)。 83 のprintf(" %LLDする\ n "、クエリ(1 、T)); 84 } 85 リターン 0 。 86 }