输入一个长度为n的整数序列。
接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数n和m。
第二行包含n个整数,表示整数序列。
接下来m行,每行包含三个整数l,r,c,表示一个操作。
输出格式
共一行,包含n个整数,表示最终序列。
数据范围
1≤n,m≤100000,
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
#include <stdio.h>
int main(){
int n,m,i,l,r,c;
scanf("%d %d",&n,&m);
int a[n+1],b[n+1];
a[0]=b[0]=0; //主要是初始化a[0]=0
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i]-a[i-1]; //差分数组
}
for(i=0;i<m;i++){
scanf("%d %d %d",&l,&r,&c);
b[l]+=c; //左端点 比前一个数的差值+c 区间之内的元素统计+c了 所以差值不变 无需修改
if(r<n) b[r+1]-=c; //右端点后面紧邻的一个元素 比前一个数的差值-c 如果是最后一个元素了 后面没有了就不用操作了
}
for(i=1;i<=n;i++){
printf("%d",a[i]=a[i-1]+b[i]); //修改后的元素 等于前一个元素+差值 修改a[i]的值并输出 如果不修改的话 没法向后传递 就出错了
if(i!=n) printf(" ");
}
return 0;
}