間隔の和を考えると、暴力は、セグメントツリーを変更します。
ルート開動作で丸められた以下1E12に等しい数が、最大1の6倍を超えていないためであることができる、我々は、平方根演算を直接画像減算として直接変更することができないことを見出したが、彼は非常に良好な特性を有しています1のために、我々は明らかに何かをする必要があるので、複雑さはO(nlogn)で修正し、データのみ1E5、その定数を気にしないでくださいしないでください。セグメントツリーの複雑さは、直接加算間隔O(nlogn)であるので、合計時間複雑度は、O(小さな定数* nlogn)であります
1つ の#pragma GCCの最適化(3、 "Ofast"、 "インライン") 2の#include <iostreamの> 3の#include <cstdioを> 4の#include <CStringの> 5の#include <アルゴリズム> 6の#include <cmath> 7 の#define N 100005 8 の#define長いlong int型 9 使用して 名前空間はstdを、 10 int型リード() 11 { 12 INT X = 0、F = 1。チャー CH = GETCHAR()。 13 一方(CH < ' 0 '|| CH> ' 9 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();} 14 ながら、(CH> = ' 0 ' && CH <= ' 9 '){(X = X << 3)+(X << 1)+(CH ^ 48)、CH = GETCHAR();} 15 リターンのx *のF。 16 } 17 int型N、M、[N]。 18 構造体ノード 19 { 20 のint L、R、和、MAXN。 21 }ツリー[N *4 ]。 22 ボイド押し上げ(int型K) 23 { 24 ツリー[K] .maxn = MAX(ツリー[K * 2 ] .maxn、ツリー[K * 2 + 1 ] .maxn)。 25 ツリー[K] .SUM =ツリー[K * 2 ] .SUM +ツリー[K * 2 + 1 ] .SUM。 26 } 27 空隙ビルド(int型 L、int型の R、int型K) 28 { 29 ツリー[K] .L = L;ツリー[K] .R = R。 30 であれば(1- ==のR) 31 { 32 ツリー[K] .SUM =ツリー[K] .maxn = [L]。 33 リターン; 34 } 35 INTミッド= L + R >> 1 。 36 ビルド(L、中、K * 2 )。 37 ビルド(MID + 1、R、K * 2 + 1 )。 38 押上(K)。 39 } 40 ボイド(変更int型のx、int型の Y、int型K) 41 { 42 のint L =ツリー[K] .L、R = ツリー[K] .Rします。 43 であれば(1- ==のR) 44 { 45 ツリー[K] .SUM = SQRT(ツリー[K] .SUM)。 46 ツリー[K] .maxn = SQRT(ツリー[K] .maxn)。 47 リターン; 48 } 49 INTミッド= L + R >> 1 。 50 であれば(X <=ミッド&&ツリー[K * 2 ] .maxn> 1)を変更(X、Y、K * 2 )。 51 であれば(Y>中間&&ツリー[K * 2 + 1 ] .maxn> 1)を変更(X、Y、K * 2 + 1 )。 52 押上(K)。 53 } 54 int型の照会(int型のx、int型の Y、int型K) 55 { 56 のint L =ツリー[K] .L、R = ツリー[K] .R。 57 場合(L> = X && R <= Y)戻りツリー[K] .SUM。 58 INT半ば= L + R >> 1、RESが= 0 ; 59 であれば(X <= MID)RES + =クエリ(X、Y、K * 2 )。 60 であれば(Y> MID)RES + =クエリ(X、Y、K * 2 + 1 )。 61の リターンRES。 62 } 63 )(主符号付き 64 { 65 (freopenはを"god.in " " R "STDIN); 66 freopenは(" god.out " " W 」)、STDOUT; 67 N = (読み取り); 68 のための(int型 i = 1 ; iが<= N; iが++) [I] = read()は、 69 の構築(1、nは、1 ) 70 、M = (読み取り); 71 int型OPT、X、Y、 72 ながら(M-- ) 73 { 74 OPTは=読み取ります(); X =リード(); Y = 読む(); 75 であれば(X> Y)スワップ(X、Y) 76 場合(OPTの== 2)変更(X、Y、1 )。 77 他ののprintf(" %LLDする\ n "、クエリ(X、Y、1 ))。 78 } 79 リターン 0 。 80 }