けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

鉄則本 A06 - How Many Guests? (4Q, ★2)

累積和に関する問題!!

問題概要

 N 日間にわたるイベントを開催し、日  i には  A_{i} 人が来場した。次の  Q 回のクエリに答えよ。

【クエリ】
各クエリでは  L, R が与えられるので、 L 日目から  R 日目までの間に合計何人が来場したかを答えよ。

制約

  •  1 \le N, Q \le 10^{5}

解法

累積和を活用します! 累積和については、次の記事に詳しく書きました。

qiita.com

この問題と本質的に同じ問題についても解説しています。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, Q;
    cin >> N >> Q;
    
    // 配列 A の入力を受け取りながら、累積和も求める
    vector<int> A(N), S(N + 1, 0);
    for (int i = 0; i < N; ++i) {
        cin >> A[i];
        S[i + 1] = S[i] + A[i];
    }
    
    // クエリに答える
    for (int iter = 0; iter < Q; ++iter) {
        int L, R;
        cin >> L >> R;
        --L;
        
        cout << S[R] - S[L] << endl;
    }
}