UOJ#495乾燥キルト

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      ビルド(11200000 );
68      のための長い  i = 1 ; iが<= N iが++ ){
 69          のscanf(" %LLD%LLD%LLD%LLD "、&​​X1、&Y11、&X2、&Y2)。
70          更新(1、最大値(X2、Y2)+ 120000000、(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 }

 

おすすめ

転載: www.cnblogs.com/hahaha2124652975/p/11351218.html