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::*;
mod fenwick_tree {
    use std::ops::*;
    pub struct FenwickTree<T> {
        data: Vec<T>,
        identity: T,
    }
    impl<T: Copy + Clone + AddAssign + Sub<Output = T>> FenwickTree<T> {
        pub fn new(size: usize, id: T) -> FenwickTree<T> {
            FenwickTree {
                data: vec![id; size + 1],
                identity: id,
            }
        }
        fn prefix_sum(&self, i: usize) -> T {
            let mut res = self.identity;
            let mut idx = i;
            while idx > 0 {
                res += self.data[idx];
                idx -= ((idx as isize) & -(idx as isize)) as usize;
            }
            res
        }
        pub fn update(&mut self, i: usize, x: T) {
            let mut idx = i;
            while idx < self.data.len() {
                self.data[idx] += x;
                idx += ((idx as isize) & -(idx as isize)) as usize;
            }
        }
        pub fn query(&self, l: usize, r: usize) -> T {
            self.prefix_sum(r) - self.prefix_sum(l - 1)
        }
    }
}

fn main() {
    let mut s: String = String::new();
    std::io::stdin().read_to_string(&mut s).ok();
    let mut itr = s.trim().split_whitespace();
    let n = itr.next().unwrap().parse::<usize>().unwrap();
    let m = itr.next().unwrap().parse::<usize>().unwrap();
    let mut ft = fenwick_tree::FenwickTree::new(n, 0);
    let mut out = Vec::new();
    for _ in 0..m {
        let c: usize = itr.next().unwrap().parse().unwrap();
        let x: usize = itr.next().unwrap().parse().unwrap();
        let y: usize = itr.next().unwrap().parse().unwrap();
        if c == 0 {
            ft.update(x, y);
        } else {
            writeln!(out, "{}", ft.query(x, y)).unwrap();
        }
    }
    stdout().write_all(&out).unwrap();
}