"구간을 저장하기 위한 트리" 중 하나로 이 외에도 Segment Tree와 Fenwick Tree가 있다.
Segment Tree로 풀 수 있는 모든 문제는 Indexed Tree로 풀 수 있다.
위의 두 조건이 모두 만족하는 문제
구간의 대표값 구하는 경우
1. 합
2. 최대, 최소
3. GCD
Leaf 노드의 첫번째 index 혹은 Leaf 노드 개수 구하기
for(B=1; B<N; B<<=1); // B<<=1 는 B*=2와 같은 의미
void update(int p, int v)
{
p += (B-1);
MinIDT[p] = v;
while(p >>= 1)
{
MinIDT[p] = min(MinIDT[p<<1], MinIDT[(p<<1)|1]);
}
}
int lgMin(int l, int r)
{
l += (B-1); r += (B-1);
int minV = INF;
while(l<=r)
{
if((l&1)==1) minV = min(minV, MinIDT[l]);
if((r&1)==0) minV = min(minV, MinIDT[r]);
l = (l+1)>>1;
r = (r-1)>>1;
}
return minV;
}
int lgSum(int l, int r)
{
l += (B-1); r += (B-1);
int sum = 0;
while(l <= r)
{
if((l&1) == 1) sum += IDT[l];
if((r&1) == 0) sum += IDT[r];
l = (l+1)>>1;
r = (r-1)>>1;
}
return sum;
}
L: tree의 R일 때, 값 취함
R: tree의 L일 때, 값 취함