/*问题描述
小朋友排成一排,老师给他们分苹果。
小朋友从左到右标号1..N。有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li+1个小朋友每人发Ci个苹果。
最后老师想知道每个小朋友有多少苹果。
输入格式
第一行两个整数N、M,表示小朋友个数和老师个数。
接下来M行,每行三个整数Li、Ri、Ci,意义如题目表述。
输出格式
一行N个数,第i个数表示第i个小朋友手上的水果。
样例输入
5 3
1 2 1
2 3 2
2 5 3
样例输出
1 6 5 3 3
数据规模和约定
40%的数据,N、M≤1 000。
100%的数据,N、M≤100 000,1≤Li≤Ri≤N,0≤Ci≤100。
*/
#if 1
#include<stdio.h>
#include<stdlib.h>
typedef
struct
{
int sm ;
int l ;
int r ;
}Tree_t;
void Input( Tree_t [] , int , int , int , int ) ;
void cs_tree( Tree_t [], int , int , int ) ;
void Output( Tree_t [] , int );
int main(void)
{
int n , m , i ;
Tree_t *app = malloc( sizeof( Tree_t) * 400000);
scanf("%d%d" , & n , & m );
cs_tree( app , 1 , 1 , n ) ;
int left , right , sum ;
for( i = 0 ; i < m ; i ++ )
{
scanf("%d%d%d" , & left , & right , & sum ) ;
Input( app , left , right , sum , 1 ) ;
}
Output( app , 1 ) ;
return 0 ;
}
void Output( Tree_t app[] , int cur)
{
if( app[cur].l == app[cur].r )
{
printf("%d " , app[cur].sm ) ;
return;
}
int ne = cur << 1 ;
app[ne].sm += app[cur].sm;
Output( app , ne ) ;
app[ne + 1 ].sm+= app[cur].sm;
Output( app , ne + 1 ) ;
}
void cs_tree( Tree_t app[] ,int cur , int left , int right )
{
if( left == right )
{
app[cur].sm = 0 ;
app[cur].l = left ;
app[cur].r = right ;
return ;
}
int mid = ( left + right ) >> 1 ;
int ne = cur << 1 ;
cs_tree( app , ne , left , mid ) ;
cs_tree( app , ne + 1 , mid + 1 , right ) ;
app[cur].sm = 0 ;
app[cur].l = left ;
app[cur].r = right ;
}
void Input( Tree_t app[] , int left , int right , int sum , int cur )
{
if( app[cur].l == left && app[cur].r == right )
{
app[cur].sm += sum ;
return ;
}
int mid = ( app[cur].l + app[cur].r) >> 1 ;
int ne = cur << 1 ;
if( right <= mid )
{
Input( app , left , right , sum , ne );
}
else
{
if(left > mid )
{
Input( app , left , right , sum , ne + 1 );
}
else
{
Input( app , left , mid , sum , ne ) ;
Input( app , mid + 1 , right , sum , ne + 1 );
}
}
}
#endif