Submission #18839845


Source Code Expand

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

type SegmentTree struct {
	data []interface{}
	n    int
	e    interface{}
	op   func(interface{}, interface{}) interface{}
}

func NewSegmentTree(n int, e interface{}, op func(interface{}, interface{}) interface{}) *SegmentTree {
	segtree := new(SegmentTree)
	segtree.op = op
	segtree.n = 1
	for segtree.n < n {
		segtree.n *= 2
	}
	segtree.data = make([]interface{}, segtree.n*2-1)
	for i := 0; i < segtree.n*2-1; i++ {
		segtree.data[i] = e
	}
	return segtree
}

func (segtree *SegmentTree) Update(idx int, x interface{}) {
	idx += segtree.n - 1
	segtree.data[idx] = x
	for 0 < idx {
		idx = (idx - 1) / 2
		segtree.data[idx] = segtree.op(segtree.data[idx*2+1], segtree.data[idx*2+2])
	}
}

func (segtree *SegmentTree) query(begin, end, idx, a, b int) interface{} {
	if b <= begin || end <= a {
		return 0
	}
	if begin <= a && b <= end {
		return segtree.data[idx]
	}
	v1 := segtree.query(begin, end, idx*2+1, a, (a+b)/2)
	v2 := segtree.query(begin, end, idx*2+2, (a+b)/2, b)
	return segtree.op(v1, v2)
}

func (segtree *SegmentTree) Query(begin, end int) interface{} {
	return segtree.query(begin, end, 0, 0, segtree.n)
}

func main() {
	const N = 300000 + 1

	segtree := NewSegmentTree(N, 0, func(a, b interface{}) interface{} { return a.(int) ^ b.(int) })

	var n, q int
	fmt.Scan(&n, &q)

	sc := bufio.NewScanner(os.Stdin)
	sc.Split(bufio.ScanWords)

	for i := 0; i < n; i++ {
		sc.Scan()
		a, _ := strconv.Atoi(sc.Text())
		segtree.Update(i, a)
	}

	for i := 0; i < q; i++ {
		sc.Scan()
		t, _ := strconv.Atoi(sc.Text())
		sc.Scan()
		x, _ := strconv.Atoi(sc.Text())
		sc.Scan()
		y, _ := strconv.Atoi(sc.Text())
		if t == 1 {
			z := segtree.Query(x-1, x)
			segtree.Update(x-1, (interface{})(z.(int)^y))
		}
		if t == 2 {
			fmt.Println(segtree.Query(x-1, y))
		}
	}
}

Submission Info

Submission Time
Task F - Range Xor Query
User Johniel
Language Go (1.14.1)
Score 600
Code Size 1925 Byte
Status AC
Exec Time 1507 ms
Memory 66152 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 20
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
All handmade_00.txt, handmade_01.txt, max_00.txt, max_01.txt, max_02.txt, max_03.txt, max_04.txt, max_05.txt, max_06.txt, max_07.txt, power_of_2_00.txt, power_of_2_01.txt, power_of_2_02.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, sample_01.txt, sample_02.txt
Case Name Status Exec Time Memory
handmade_00.txt AC 48 ms 18840 KiB
handmade_01.txt AC 45 ms 18828 KiB
max_00.txt AC 1329 ms 60232 KiB
max_01.txt AC 1325 ms 60084 KiB
max_02.txt AC 1169 ms 62384 KiB
max_03.txt AC 1181 ms 59708 KiB
max_04.txt AC 1507 ms 57992 KiB
max_05.txt AC 1263 ms 58076 KiB
max_06.txt AC 1075 ms 66152 KiB
max_07.txt AC 1216 ms 57264 KiB
power_of_2_00.txt AC 1014 ms 60572 KiB
power_of_2_01.txt AC 1019 ms 58428 KiB
power_of_2_02.txt AC 1000 ms 57524 KiB
random_00.txt AC 958 ms 45772 KiB
random_01.txt AC 808 ms 54804 KiB
random_02.txt AC 206 ms 37200 KiB
random_03.txt AC 965 ms 54152 KiB
random_04.txt AC 124 ms 28964 KiB
sample_01.txt AC 39 ms 18828 KiB
sample_02.txt AC 40 ms 18828 KiB