// File: aydarbiktimirov[P]data-structures/src/main.cpp
// Function: main
int main()
{
	std::cout << "array size: ";
	size_t n;
	std::cin >> n;
	std::vector<int> a(n);
	std::cout << "array: ";
	for (size_t i = 0; i < a.size(); ++i)
	{
		std::cin >> a[i];
	}

	CPersistentSegmentTree<int, std::plus<int> > tree(a.begin(), a.end(), 0);
	for (std::string cmd; !std::cin.eof(); )
	{
		std::cout << "> ";
		std::cin >> cmd;
		if (cmd == "help")
		{
			std::cout << "\tprint\t\tprint current version of a" << std::endl;
			std::cout << "\tversion count\tprint number of versions" << std::endl;
			std::cout << "\tversion show\tprint current version" << std::endl;
			std::cout << "\tversion set i\tselect i'th version of segment tree" << std::endl;
			std::cout << "\tchange i x\tchange i'th element to x" << std::endl;
			std::cout << "\tsum i j\t\tprint sum from i'th element to j'th" << std::endl;
			std::cout << "\texit\t\texit" << std::endl;
		} else if (cmd == "print") {
			std::cout << "\t";
			for (size_t i = 0; i < a.size(); ++i)
			{
				std::cout << tree(i, i) << " ";
			}
			std::cout << std::endl;
		} else if (cmd == "version") {
			std::cin >> cmd;
			if (cmd == "count")
			{
				std::cout << "\t" << tree.GetVersionCount() << std::endl;
			} else if (cmd == "set") {
				size_t v;
				std::cin >> v;
				tree.SetVersion(v);
			} else if (cmd == "show") {
				std::cout << tree.GetCurrentVersion() << std::endl;
			} else {
				std::cout << "\tincorrect command" << std::endl;
			}
		} else if (cmd == "change") {
			size_t i;
			int v;
			std::cin >> i >> v;
			tree.Change(i, v);
		} else if (cmd == "sum") {
			size_t i, j;
			std::cin >> i >> j;
			std::cout << "\t" << tree(i, j) << std::endl;
		} else if (cmd == "exit") {
			break;
		} else {
			std::cout << "\tincorrect command" << std::endl;
		}
	}

	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x230, %rsp            # imm = 0x230
movl $0x0, -0x4(%rbp)
movq 0x8aa7(%rip), %rdi      # 0xafc0
leaq 0x4b38(%rip), %rsi      # 0x7058
callq 0x2100
movq 0x8ab4(%rip), %rdi      # 0xafe0
leaq -0x10(%rbp), %rsi
callq 0x2160
movq -0x10(%rbp), %rax
movq %rax, -0x130(%rbp)
leaq -0x29(%rbp), %rdi
movq %rdi, -0x128(%rbp)
callq 0x2d50
movq -0x130(%rbp), %rsi
movq -0x128(%rbp), %rdx
leaq -0x28(%rbp), %rdi
callq 0x2d70
jmp 0x2569
leaq -0x29(%rbp), %rdi
callq 0x2de0
movq 0x8a47(%rip), %rdi      # 0xafc0
leaq 0x4ae5(%rip), %rsi      # 0x7065
callq 0x2100
jmp 0x2587
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x138(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x2e00
movq %rax, %rcx
movq -0x138(%rbp), %rax
cmpq %rcx, %rax
jae 0x260b
movq -0x48(%rbp), %rsi
leaq -0x28(%rbp), %rdi
callq 0x2e20
movq %rax, %rsi
movq 0x8a17(%rip), %rdi      # 0xafe0
callq 0x20b0
jmp 0x25d0
jmp 0x25d2
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x258f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x29(%rbp), %rdi
callq 0x2de0
jmp 0x2d3f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x2d36
leaq -0x28(%rbp), %rdi
movq %rdi, -0x140(%rbp)
callq 0x2e40
movq -0x140(%rbp), %rdi
movq %rax, -0xb8(%rbp)
callq 0x2e70
movq %rax, -0xc0(%rbp)
movl $0x0, -0xc4(%rbp)
movq -0xb8(%rbp), %rsi
movq -0xc0(%rbp), %rdx
leaq -0xb0(%rbp), %rdi
leaq -0xc4(%rbp), %rcx
callq 0x2ea0
jmp 0x2662
leaq -0xe8(%rbp), %rdi
callq 0x2150
movq 0x896b(%rip), %rdi      # 0xafe0
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x21e0
movb %al, -0x141(%rbp)
jmp 0x268c
movb -0x141(%rbp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x26d0
movl $0x5, -0xec(%rbp)
jmp 0x2cf8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0xe8(%rbp), %rdi
callq 0x20c0
leaq -0xb0(%rbp), %rdi
callq 0x3140
jmp 0x2d36
movq 0x88e9(%rip), %rdi      # 0xafc0
leaq 0x498f(%rip), %rsi      # 0x706d
callq 0x2100
jmp 0x26e5
movq 0x88f4(%rip), %rdi      # 0xafe0
leaq -0xe8(%rbp), %rsi
callq 0x2140
jmp 0x26fa
leaq 0x496f(%rip), %rsi      # 0x7070
leaq -0xe8(%rbp), %rdi
callq 0x3000
movb %al, -0x142(%rbp)
jmp 0x2715
movb -0x142(%rbp), %al
testb $0x1, %al
jne 0x2724
jmp 0x2880
movq 0x8895(%rip), %rdi      # 0xafc0
leaq 0x4943(%rip), %rsi      # 0x7075
callq 0x2100
movq %rax, -0x150(%rbp)
jmp 0x2740
movq -0x150(%rbp), %rdi
movq 0x8862(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x2755
movq 0x8864(%rip), %rdi      # 0xafc0
leaq 0x4935(%rip), %rsi      # 0x7098
callq 0x2100
movq %rax, -0x158(%rbp)
jmp 0x2771
movq -0x158(%rbp), %rdi
movq 0x8831(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x2786
movq 0x8833(%rip), %rdi      # 0xafc0
leaq 0x492c(%rip), %rsi      # 0x70c0
callq 0x2100
movq %rax, -0x160(%rbp)
jmp 0x27a2
movq -0x160(%rbp), %rdi
movq 0x8800(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x27b7
movq 0x8802(%rip), %rdi      # 0xafc0
leaq 0x491f(%rip), %rsi      # 0x70e4
callq 0x2100
movq %rax, -0x168(%rbp)
jmp 0x27d3
movq -0x168(%rbp), %rdi
movq 0x87cf(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x27e8
movq 0x87d1(%rip), %rdi      # 0xafc0
leaq 0x4921(%rip), %rsi      # 0x7117
callq 0x2100
movq %rax, -0x170(%rbp)
jmp 0x2804
movq -0x170(%rbp), %rdi
movq 0x879e(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x2819
movq 0x87a0(%rip), %rdi      # 0xafc0
leaq 0x4915(%rip), %rsi      # 0x713c
callq 0x2100
movq %rax, -0x178(%rbp)
jmp 0x2835
movq -0x178(%rbp), %rdi
movq 0x876d(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x284a
movq 0x876f(%rip), %rdi      # 0xafc0
leaq 0x4912(%rip), %rsi      # 0x716a
callq 0x2100
movq %rax, -0x180(%rbp)
jmp 0x2866
movq -0x180(%rbp), %rdi
movq 0x873c(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x287b
jmp 0x2cf3
leaq 0x48ef(%rip), %rsi      # 0x7176
leaq -0xe8(%rbp), %rdi
callq 0x3000
movb %al, -0x181(%rbp)
jmp 0x289b
movb -0x181(%rbp), %al
testb $0x1, %al
jne 0x28aa
jmp 0x2971
movq 0x870f(%rip), %rdi      # 0xafc0
leaq 0x48c4(%rip), %rsi      # 0x717c
callq 0x2100
jmp 0x28bf
movq $0x0, -0xf8(%rbp)
movq -0xf8(%rbp), %rax
movq %rax, -0x190(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x2e00
movq %rax, %rcx
movq -0x190(%rbp), %rax
cmpq %rcx, %rax
jae 0x2957
movq -0xf8(%rbp), %rdx
leaq -0xb0(%rbp), %rdi
movq %rdx, %rsi
callq 0x3030
movl %eax, -0x194(%rbp)
jmp 0x290e
movl -0x194(%rbp), %esi
movq 0x86a5(%rip), %rdi      # 0xafc0
callq 0x21c0
movq %rax, -0x1a0(%rbp)
jmp 0x2929
movq -0x1a0(%rbp), %rdi
leaq 0x472c(%rip), %rsi      # 0x7063
callq 0x2100
jmp 0x293e
jmp 0x2940
movq -0xf8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xf8(%rbp)
jmp 0x28ca
movq 0x8662(%rip), %rdi      # 0xafc0
movq 0x864b(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x296c
jmp 0x2cf1
leaq 0x4764(%rip), %rsi      # 0x70dc
leaq -0xe8(%rbp), %rdi
callq 0x3000
movb %al, -0x1a1(%rbp)
jmp 0x298c
movb -0x1a1(%rbp), %al
testb $0x1, %al
jne 0x299b
jmp 0x2b3f
movq 0x863e(%rip), %rdi      # 0xafe0
leaq -0xe8(%rbp), %rsi
callq 0x2140
jmp 0x29b0
leaq 0x47c7(%rip), %rsi      # 0x717e
leaq -0xe8(%rbp), %rdi
callq 0x3000
movb %al, -0x1a2(%rbp)
jmp 0x29cb
movb -0x1a2(%rbp), %al
testb $0x1, %al
jne 0x29d7
jmp 0x2a3e
movq 0x85e2(%rip), %rdi      # 0xafc0
leaq 0x4797(%rip), %rsi      # 0x717c
callq 0x2100
movq %rax, -0x1b0(%rbp)
jmp 0x29f3
leaq -0xb0(%rbp), %rdi
callq 0x2410
movq %rax, -0x1b8(%rbp)
jmp 0x2a08
movq -0x1b8(%rbp), %rsi
movq -0x1b0(%rbp), %rdi
callq 0x2040
movq %rax, -0x1c0(%rbp)
jmp 0x2a24
movq -0x1c0(%rbp), %rdi
movq 0x857e(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x2a39
jmp 0x2b3a
leaq 0x473f(%rip), %rsi      # 0x7184
leaq -0xe8(%rbp), %rdi
callq 0x3000
movb %al, -0x1c1(%rbp)
jmp 0x2a59
movb -0x1c1(%rbp), %al
testb $0x1, %al
jne 0x2a65
jmp 0x2a94
movq 0x8574(%rip), %rdi      # 0xafe0
leaq -0x100(%rbp), %rsi
callq 0x2160
jmp 0x2a7a
movq -0x100(%rbp), %rsi
leaq -0xb0(%rbp), %rdi
callq 0x2380
jmp 0x2a8f
jmp 0x2b38
leaq 0x46ed(%rip), %rsi      # 0x7188
leaq -0xe8(%rbp), %rdi
callq 0x3000
movb %al, -0x1c2(%rbp)
jmp 0x2aaf
movb -0x1c2(%rbp), %al
testb $0x1, %al
jne 0x2abb
jmp 0x2b03
leaq -0xb0(%rbp), %rdi
callq 0x2430
movq %rax, -0x1d0(%rbp)
jmp 0x2ad0
movq -0x1d0(%rbp), %rsi
movq 0x84e2(%rip), %rdi      # 0xafc0
callq 0x2040
movq %rax, -0x1d8(%rbp)
jmp 0x2aec
movq -0x1d8(%rbp), %rdi
movq 0x84b6(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x2b01
jmp 0x2b36
movq 0x84b6(%rip), %rdi      # 0xafc0
leaq 0x467c(%rip), %rsi      # 0x718d
callq 0x2100
movq %rax, -0x1e0(%rbp)
jmp 0x2b1f
movq -0x1e0(%rbp), %rdi
movq 0x8483(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x2b34
jmp 0x2b36
jmp 0x2b38
jmp 0x2b3a
jmp 0x2cef
leaq 0x465a(%rip), %rsi      # 0x71a0
leaq -0xe8(%rbp), %rdi
callq 0x3000
movb %al, -0x1e1(%rbp)
jmp 0x2b5a
movb -0x1e1(%rbp), %al
testb $0x1, %al
jne 0x2b66
jmp 0x2bb8
movq 0x8473(%rip), %rdi      # 0xafe0
leaq -0x108(%rbp), %rsi
callq 0x2160
movq %rax, -0x1f0(%rbp)
jmp 0x2b82
movq -0x1f0(%rbp), %rdi
leaq -0x10c(%rbp), %rsi
callq 0x20b0
jmp 0x2b97
movq -0x108(%rbp), %rsi
leaq -0xb0(%rbp), %rdi
leaq -0x10c(%rbp), %rdx
callq 0x3080
jmp 0x2bb3
jmp 0x2ced
leaq 0x45e8(%rip), %rsi      # 0x71a7
leaq -0xe8(%rbp), %rdi
callq 0x3000
movb %al, -0x1f1(%rbp)
jmp 0x2bd3
movb -0x1f1(%rbp), %al
testb $0x1, %al
jne 0x2be2
jmp 0x2c83
movq 0x83f7(%rip), %rdi      # 0xafe0
leaq -0x118(%rbp), %rsi
callq 0x2160
movq %rax, -0x200(%rbp)
jmp 0x2bfe
movq -0x200(%rbp), %rdi
leaq -0x120(%rbp), %rsi
callq 0x2160
jmp 0x2c13
movq 0x83a6(%rip), %rdi      # 0xafc0
leaq 0x455b(%rip), %rsi      # 0x717c
callq 0x2100
movq %rax, -0x208(%rbp)
jmp 0x2c2f
movq -0x118(%rbp), %rsi
movq -0x120(%rbp), %rdx
leaq -0xb0(%rbp), %rdi
callq 0x3030
movl %eax, -0x20c(%rbp)
jmp 0x2c51
movl -0x20c(%rbp), %esi
movq -0x208(%rbp), %rdi
callq 0x21c0
movq %rax, -0x218(%rbp)
jmp 0x2c6c
movq -0x218(%rbp), %rdi
movq 0x8336(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x2c81
jmp 0x2ceb
leaq 0x44e7(%rip), %rsi      # 0x7171
leaq -0xe8(%rbp), %rdi
callq 0x3000
movb %al, -0x219(%rbp)
jmp 0x2c9e
movb -0x219(%rbp), %al
testb $0x1, %al
jne 0x2caa
jmp 0x2cb6
movl $0x5, -0xec(%rbp)
jmp 0x2cf8
movq 0x8303(%rip), %rdi      # 0xafc0
leaq 0x44c9(%rip), %rsi      # 0x718d
callq 0x2100
movq %rax, -0x228(%rbp)
jmp 0x2cd2
movq -0x228(%rbp), %rdi
movq 0x82d0(%rip), %rsi      # 0xafb0
callq 0x2130
jmp 0x2ce7
jmp 0x2ce9
jmp 0x2ceb
jmp 0x2ced
jmp 0x2cef
jmp 0x2cf1
jmp 0x2cf3
jmp 0x266e
leaq -0xe8(%rbp), %rdi
callq 0x20c0
movl $0x0, -0x4(%rbp)
movl $0x1, -0xec(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0x3140
leaq -0x28(%rbp), %rdi
callq 0x31b0
movl -0x4(%rbp), %eax
addq $0x230, %rsp            # imm = 0x230
popq %rbp
retq
leaq -0x28(%rbp), %rdi
callq 0x31b0
movq -0x38(%rbp), %rdi
callq 0x21d0
nopl (%rax,%rax)