꽉 전기 멀티 보정 제 -B 동작

제목 설명

길이 n의 정수의 시퀀스가 오퍼레이션 두 가지 종류가있다 :
0 LR 알 일부 번호를 선택 ... 그들의 XOR 합이 최대이고, 상기 최대 값을 출력하도록 AR.
X는 1 : 시퀀스의 끝에 X를 추가 및 N = N + 1하자.

기입

여러 테스트 케이스가 있습니다. 입력의 첫 번째 라인은 테스트 케이스의 수를 나타내는 정수 T (T≤10)을 포함한다.
각 테스트 케이스의 경우 : 
첫 번째 라인은 두 정수 N, m (1≤n≤5 105,1≤m≤5 × × 105), 시퀀스에서 처음 정수의 숫자 및 연산의 수를 포함한다.
두 번째 행은 N 개의 정수 A1, A2, ..., (0≤ai <230)의 초기 시퀀스를 나타내는을 포함한다.
다음의 m 라인의 각각은 상기 소정의 동작 중 하나를 포함한다.
그것은 Σn≤106, Σm≤106,0≤x <230 보장합니다.
그리고 작업은 암호화됩니다. 당신은 lastans 마지막 0을 입력 동작에 대한 답을 나타내며, 처음에 제로로는 다음 작업을 디코딩해야합니다 
모든 유형 0 동작을 위해 개조 N + 1, R = ((R)의 배타적 lastans) 개조 N + 1, L = (L 개의 배타적 lastans)을하게하고 교체 (L, R)의 경우 L> R.
모든 유형 1 작동을 위해, X = X XOR의 lastans을 할 수 있습니다.

수출

각 유형 0 동작주세요 출력 한 줄의 최대 XOR 합.

샘플 입력

1 
3 3 
0 1 2 
0 1 1 
1 3 
0 3 4

샘플 출력

1 
3
질문의 의미 
쿼리 간격 [L, R은 상기 최대의 XOR이다. 
공식 해결 방법 : 연습 폭력은 데이터베이스 구간 선형 구조를 유지할 수 있습니다, 그러나 확실하게 전달할 수 없었다.
각 그룹 프리픽스 선형 염기 서열 (삼각형), 선형을 유지 욕심 오른쪽에 위치 번호는 가능한 한 높은 나타나는 
동시에 디지털상의 대응 위치를 기록하는 시간의 새로운 번호 삽입되었는지 위치에 출현하고, 상기 시간을 찾기 위해 위치에 삽입 될 수있는 경우에 디지털 로우 푸시의 원래 위치에 원래 번호 위치보다 오른쪽에 상기 새로운 도면.
낮은 통과 높은 중 최대 값을 선택했을 때 비트 간격의 좌단의 오른쪽에 번호가 질의에 나타나고 응답이 크게 할 수있는 경우, 상기 배타적 OR에 대한 응답이다. 
모든 선형 그룹의 경우, 그것은 더 높은 위치가 확실히의 오른쪽에 나타납니다 (또는 해당 위치에 삽입됩니다)에 따라 독점 또는 디지털 선형을했다, 그래서 연습은 분명 정확성이다.
선형 그룹 : 
https://blog.csdn.net/a_forever_dream/article/details/83654397
https://blog.sengxian.com/algorithms/linear-basis?tdsourcetag=s_pctim_aiomsg
#INCLUDE <. 비트 / stdc ++ H>
 #DEFINE가 긴 긴 것이다
 사용  스페이스 성병;
CONST의  INT N = 5e5 + (10) ;
INT T, N, m;
INT의 P [N] [ 31 ], POS [N] [ 31 ];
보이드 추가 ( INT 계산해 의 INT (X)) 
{ 
    위해 ( int로 I = 0 ; I는 <= 30 , P [X] [I] = P [X-] 난 ++) (1) [I], POS [X] [I] = POS [X- 1 ] [I];
    int로 지금 = X;
    위한 ( int로 난 = 30 , I> =0 ; 난 ... )
     의 경우 (발 & ( 1 << I)) 
    { 
        경우 라! ( P [X] [I]) 
        { 
            P [X] [I] = 브로; 
            POS [X] [I] = 현재;
            휴식 ; 
        } 
        경우 (POS [X] [I]가 < 지금) 스왑 (p [X] [I], 발), 스왑 (POS [X] [i]는, 현재); 
        브로 ^ = P [X] [I]; 
    } 
} 
INT의 쿼리 ( INT의 L, INT의 R) 
{ 
    INT RET = 0 ;
     ( INT J =30 ; J> = 0 ; j-- )
         경우 POS ([R] [J]> = 1 && (RET ^ P [R] [J])> RET) RET ^ = P [R] [J]
    반환 RET를; 
} 
INT 의 main () 
{ 
   // freopen을 ( "1.in", "R", 표준 입력);
   // freopen을 ( "1.out", "w", 표준 출력); 
    scanf와 ( " %의 D ' , T);
    반면 (T-- ) 
    { 
        는 scanf ( " %의 D % d에 " , N, m);
        INT의 OP, X, L, R;
        
        { 
            는 scanf ( " %의 D ' , X); 
            추가 (X, I); 
        } 
        INT lastans = 0 ;
        반면 (M-- ) 
        { 
            는 scanf ( " %의 D " , OP);
            경우 (연산 == 0 ) 
            { 
                는 scanf ( " % d 개 %의 D ' , L, R); 
                L = (L ^ lastans) %의 N + 1 ; 
                R = (R ^ lastans) %의 N + 1 ;
                경우 (L>R) - 스왑 (L, R); 
                lastans = 쿼리 (L, R); 
                의 printf ( " % D \ 없음 " , lastans); 
            } 
            다른 
            { 
                는 scanf ( " %의 D ' , X); 
                X ^ = lastans; 
                N ++ ; 
                (X, n)에 추가; 
            } 
        } 
    } 
   // FCLOSE (표준 입력)
   // FCLOSE (표준 출력); 
    반환  0 ; 
}
코드보기

 

 

추천

출처www.cnblogs.com/tetew/p/11234724.html