一维差分
内存限制: 128 MiB 时间限制: 1000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较
题目描述
输入一个长度为 n 的整数序列。
接下来输入m个操作,每个操作包含三个整数 l , r , c,表示将序列中 [ l , r ] 之间的每个数加上 c 。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 n 和 m 。
第二行包含 n 个整数,表示整数序列。
接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。
输出格式
共一行,包含 n 个整数,表示最终序列。
样例
输入样例:
复制6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
复制3 4 5 3 4 2
数据范围与提示
1 <= n , m <= 100000,
1 <= l <= r <= n,
-1000 <= c <= 1000,
-1000 <= a [ i ] <= 1000
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int n, m, l, r, k;
int a[maxn], d[maxn], sum[maxn];
int main() {
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
d[i] = a[i] - a[i - 1];
}
while(m--) {
scanf("%d %d %d", &l, &r, &k);
d[l] += k;
d[r + 1] -= k;
}
for(int i = 1; i <= n; i++) {
sum[i] = sum[i - 1] + d[i];
}
for(int i = 1; i <= n; i++) {
printf("%d ", sum[i]);
}
return 0;
}