概要
累積和って言うらしい。知らんくても思いつくだろう。要するにいちいち計算するんじゃなくて、一気にまとめておいて後から計算するって話。
use proconio::input;
fn main() {
input! {
n: usize,
cp: [[usize; 2]; n],
q: usize,
lr: [[usize; 2]; q],
}
// storageは累積和を格納する
// つまり、storage[i][0]はC_i番目の出席番号までの1組の期末点数の合計
let mut storage = vec![];
let mut tmp = vec![0,0];
for i in 0..n {
if cp[i][0] == 1 {
tmp[0] += cp[i][1];
} else {
tmp[1] += cp[i][1];
}
storage.push(tmp.clone());
}
for i in 0..q {
let l = lr[i][0] - 1;
let r = lr[i][1] - 1;
let mut ans = vec![0,0];
if l > 0 {
ans[0] = storage[r][0] - storage[l-1][0];
ans[1] = storage[r][1] - storage[l-1][1];
} else {
ans[0] = storage[r][0];
ans[1] = storage[r][1];
}
println!("{} {}", ans[0], ans[1]);
}
}