Это может быть уменьшено:
vector<long> arr(n,0);
for(long i=0;i<m;i++)
{
for(long t=q[i][0];t<=q[i][1];t++)
{
arr[t-1]+=q[i][2];
}
}
до чего-то вроде:
vector<long> arr(n + 1,0); // n+1 needed because q[i][1] can be n-1
for(long i=0;i<m;i++)
{
arr[q[i][0]] += q[i][2];
arr[q[i][1] + 1] -= q[i][2];
}
long sum = 0;
for(long i=0;i<m;i++) {
sum += arr[i];
arr[i] = sum;
}
Это работает, потому что, например, пусть a := [0, 0, 0, 0, 0]
, и вы хотите добавить 5 для элементов начальногомассив со 2-го по 4-й (не включен), затем вы можете сделать a[1] += 5
, a[3] -= 5
(a
is [0, 5, 0, -5, 0]
) и затем вычислить суммы префиксов для a
, это будет то, сколько вам нужно добавить ккаждый элемент вашего исходного массива (в данном случае [0, 5, 5, 0, 0]
).