Problem:
Range Sum Query

Write a program which manipulates a sequence A = {a1, a2, . . . , an} with the following operations:

add(i, x): add x to ai.

getSum(s, t): print the sum of as, as+1,...,at.

Note that the initial values of ai (i = 1, 2, . . . , n) are 0.

Input

n q
com1 x1 y1
com2 x2 y2
...
comq xq yq

In the first line, n (the number of elements in A) and q (the number of queries) are given. Then, q queries are given where com represents the type of queries. '0' denotes add(xi, yi) and '1' denotes getSum(xi, yi).

Output

For each getSum operation, print the sum in a line.

Constraints

1 ≤ n ≤ 100000

1 ≤ q ≤ 100000

If comi is 0, then 1 ≤ xi ≤ n, 0 ≤ yi ≤ 1000.

If comi is 1, then 1 ≤ xi ≤ n, 1 ≤ yi ≤ n.

Sample Input 1

3 5
0 1 1
0 2 2
0 3 3
1 1 2
1 2 2

Sample Output 1

3
2

Solution in Rust (judge verdict: Accepted)

use std::io::{stdin, Read, StdinLock};
use std::str::FromStr;

fn main() {
    let cin = stdin();
    let mut scan = Scanner::new(cin.lock());

    let n = scan.read::<usize>();
    let q = scan.read::<usize>();
    let mut segtree = SegTree::new(vec![0;n], 0, |a,b| a+b);
    for _ in 0..q {
        let com = scan.read::<i32>();
        if com == 0 {
            let x = scan.read::<usize>()-1;
            let y = scan.read::<i64>();
            let pre = {segtree.get_one(x)};
            segtree.set(x, pre + y);
        } else {
            let x = scan.read::<usize>()-1;
            let y = scan.read::<usize>()-1;
            println!("{}", segtree.get(x..y+1));
        }
    }
}

use std::ops::Range;

fn contains(p: &Range<usize>, q: &Range<usize>) -> bool {
    p.start <= q.start && q.end <= p.end
}

fn separates(p: &Range<usize>, q: &Range<usize>) -> bool {
    p.end <= q.start || q.end <= p.start
}

struct SegTree<'a> {
    node: Vec<i64>,
    zero: i64,
    op: Box<Fn(i64, i64) -> i64 + 'a>,
    n: usize,
}

impl <'a> SegTree<'a> {
    fn new<B>(v: Vec<i64>, zero: i64, op: B) -> SegTree<'a> where B: Fn(i64, i64) -> i64 + 'a {
        let size = v.len();
        let mut n = 1usize;
        while n < size {n *= 2}
        let mut node = vec![zero; 2*n-1];
        for i in 0..size {node[i+n-1] = v[i]}
        for i in (0..n - 1).rev() {node[i] = op(node[2*i+1], node[2*i+2])}
        SegTree {node: node, zero: zero, op: Box::new(op), n: n}
    }

    fn set(&mut self, mut x: usize, value: i64) {
        x += self.n - 1;
        self.node[x] = value;
        while x > 0 {
            x = (x - 1) / 2;
            self.node[x] = (self.op)(self.node[2*x+1], self.node[2*x+2]);
        }
    }

    fn get_one(&self, i: usize) -> i64 {self.getrec(i..i+1, 0, 0..self.n)}
    fn get(&self, query: Range<usize>) -> i64 {self.getrec(query, 0, 0..self.n)}

    fn getrec(&self, query: Range<usize>, k: usize, range: Range<usize>) -> i64 {
        if separates(&query, &range) {return self.zero}
        if contains(&query, &range) {return self.node[k]}
        let vl = self.getrec(query.clone(), 2*k+1, range.start..(range.start + range.end)/2);
        let vr = self.getrec(query.clone(), 2*k+2, (range.start + range.end)/2..range.end);
        (self.op)(vl, vr)
    }
}

// region template
#[allow(dead_code)]
fn uz(i: i32) -> usize { i as usize }

struct Scanner<'a> {
    cin: StdinLock<'a>,
}

#[allow(dead_code)]
impl<'a> Scanner<'a> {
    fn new(cin: StdinLock<'a>) -> Scanner<'a> {
        Scanner { cin: cin }
    }

    fn read1<T: FromStr>(&mut self) -> Option<T> {
        let token = self.cin.by_ref().bytes().map(|c| c.unwrap() as char)
            .skip_while(|c| c.is_whitespace())
            .take_while(|c| !c.is_whitespace())
            .collect::<String>();
        token.parse::<T>().ok()
    }

    fn read<T: FromStr>(&mut self) -> T {
        self.read1().unwrap()
    }

    fn readn<T: FromStr>(&mut self, n: i32) -> Vec<T> {
        let mut ret = vec![];
        for _ in 0..n { ret.push(self.read::<T>()) }
        ret
    }

    fn chars(&mut self) -> Vec<char> {
        self.read::<String>().chars().collect()
    }
}
// endregion