Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

断層(Geologic Fault)

遠い昔，IOI 文明という高度な文明が栄えていた．しかし，火山の噴火により，この高度な文明はついに滅んでしまった．IOI 文明は直線状の河川に沿って繁栄しており，IOI 文明が滅んだとき，その地表面は平らであった．IOI 文明の跡地は座標平面のx 軸と見なすことができる．y 軸は高さ方向を表す．すなわち，座標平面において，直線 $y = 0$ は地表を，領域 $y > 0$ は地上を，領域 $y < 0$ は地下を表す．また，IOI 文明が滅んだとき，$a$ 年前$(a \geq 0)$ の地層は，直線 $y = -a$ の位置にあった．

IOI 文明が滅んだ後，IOI 文明の跡地では $Q$ 回の地殻変動が起きた．$i$ 回目$(1 \leq i \leq Q)$ の地殻変動は，位置 $X_i$，方向 $D_i$，変動の量 $L_i$ で表される．$D_i$ は 1 または 2 である．$i$ 回目の地殻変動は以下のように起きる．

地層の移動が次のように起きる．

$D_i = 1$ のとき，断層が点$(X_i, 0)$ を通る傾き $1$ の直線に沿って造られ，この直線より上の領域にある地層が，直線に沿って高さ $L_i$ だけ移動する．すなわち，この直線より上の点 $(x, y)$ は，点$(x + L_i, y + L_i)$ に移動する．

$D_i = 2$ のとき，断層が点$(X_i, 0)$ を通る傾き $-1$ の直線に沿って造られ，この直線より上の領域にある地層が，直線に沿って高さ $L_i$ だけ移動する．すなわち，この直線より上の点$(x, y)$ は，点$(x - L_i, y + L_i)$ に移動する．

そのすぐ後に，領域 $y > 0$ の地層が風化によってすべて消える．

時は変わり現代，考古学者のJOI 博士はIOI 文明の遺跡を発掘することにした．JOI 博士はどの位置の地表の地層が，IOI 文明が滅ぶ何年前の地層であるかを知りたい．どのような地殻変動が起きたかは分かっている．あなたの仕事は，JOI 博士にかわって，$1 \leq i \leq N$ を満たす各整数 $i$ について，点$(i-1, 0)$ と点$(i, 0)$の間の地表の地層がIOI 文明が滅ぶ何年前の地層であるかを求めることである．

課題

IOI 文明の跡地に起きたの情報が与えられたとき，すべての整数 $i$ $(1 \leq i \leq N)$ に対し，点$(i - 1, 0)$ と点$(i, 0)$ の間の地表の地層がIOI 文明が滅ぶ何年前の地層であるかを出力せよ．

入力

標準入力から以下の入力を読み込め．

1 行目には， 2 個の整数 $N, Q$ が空白を区切りとして書かれている．これは，答えを求める地点の数が $N$，地殻変動の回数が $Q$ であることを表す．

続く $Q$ 行のうちの $i$ 行目$(1 \leq i \leq Q)$ には，3 個の整数 $X_i, D_i, L_i$ が空白を区切りとして書かれている．これは，$i$ 回目の地殻変動の位置が $X_i$，方向が $D_i$，変動の量が $L_i$ であることを表す．

出力

出力は $N$ 行からなる．標準出力の $i$ 行目$(1 \leq i \leq N)$ には，点$(i - 1, 0)$ と点$(i, 0)$ の間の地表の地層がIOI文明が滅ぶ何年前の地層であるかを表す整数を出力せよ．

制限

すべての入力データは以下の条件を満たす．

$1 \leq N \leq 200 000$

$1 \leq Q \leq 200 000$

$ -1 000 000 000 \leq X_i \leq 1 000 000 000$ $(1 \leq i \leq Q)$

$1 \leq D_i \leq 2$ $(1 \leq i \leq Q)$

$1 \leq L_i \leq 1 000 000 000$ $(1 \leq i \leq Q)$

入出力例

入力例1

10 2
12 1 3
2 2 2

出力例1

3
3
5
5
5
5
5
5
2
2

この入力例は，以下の図に対応する．

入力例2

10 6
14 1 1
17 1 1
-6 2 1
3 2 1
4 1 1
0 2 1

出力例2

5
5
4
5
5
5
5
5
4
4

入力例3

15 10
28 1 7
-24 2 1
1 1 1
8 1 1
6 2 1
20 1 3
12 2 2
-10 1 3
7 2 1
5 1 2

出力例3

15
14
14
14
14
12
12
12
12
12
12
12
15
15
12

第15回 日本情報オリンピック本選 課題   2016 年 2 月 14 日

Solution in C++ (judge verdict: Accepted)

//============================================================================
// Name        : JOI.cpp
// Author      :2015 ho3
// Version     :???11:08
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include<algorithm>
#include <queue>
using namespace std;

int N,Q;
long long X[200001]={};
int D[200001]={};
int L[200001]={};
const int INF=1000000001;
long long BX[300002];
long long BY[300002];
int N_MAX=18;

long long outBY(int n1){
	long long ans=0;
	int ps=0;
	for(int i=(1<<N_MAX);i>0;i=(i>>1)){
		if(n1>=i){
			ans+=BY[i+ps];
			n1-=i;
			ps+=i;
			if(n1==0)break;
		}
	}
	return ans;
}
long long outBX(int n1){
	long long ans=0;
	int ps=0;
	for(int i=(1<<N_MAX);i>0;i=(i>>1)){
		if(n1>=i){
			ans+=BX[i+ps];
			n1-=i;
			ps+=i;
			if(n1==0)break;
		}
	}
	return ans;

}
int inBX(int n1,int p){
	int ps=0;
	for(int i=(1<<N_MAX);i>0;i=(i>>1)){
		if(n1<=i)BX[i+ps]+=(long long)p;
		if(n1>=i){
			n1-=i;
			ps+=i;
			if(n1==0)break;
		}
	}
	return 0;
}
int inBY(int n1,int p){
	int flg=0;
	for(int i=1;i<1<<(N_MAX+1);i=i<<1){
		if((n1&i)==i){
			if(flg==0){
				flg=1;
				BY[n1]+=(long long)p;
			}
			n1-=i;
		}else if(flg==1){
			BY[n1+i]+=(long long)p;
		}
	}
	return 0;
}

int initBX(){
	for(int i=1;i<N+1;++i)inBX(i,1);
	return 0;
}
int searchD1(long long x1){
//	if(BX[1]+BY[1]>x1)return 0;
	if(BX[1<<N_MAX]+BY[1<<N_MAX]<x1)return N+1;
	int bs=0;
	for(int i=1<<(N_MAX-1);i>0;i=i>>1){
		if(BX[bs+i]+BY[bs+i]<=x1){
			x1-=(BX[bs+i]+BY[bs+i]);
			bs+=i;
		}
	}
	return bs;
}
int searchD2(long long x1){
//	if(BX[1]-BY[1]>x1)return 0;
	if(BX[1<<N_MAX]-BY[1<<N_MAX]<x1)return N+1;
	int bs=0;
	for(int i=(1<<(N_MAX-1));i>0;i=(i>>1)){
		if(BX[bs+i]-BY[bs+i]<=x1){
			x1-=(BX[bs+i]-BY[bs+i]);
			bs+=i;
		}
	}
	return bs;
}



int main() {
	cin>>N>>Q;

	for(int i=0;i<Q;++i)cin>>X[i]>>D[i]>>L[i];

	initBX();

	int pos=0;
	for(int i=Q-1;i>-1;--i){
		if(D[i]==1){
			pos=searchD1(X[i]);
			if(pos>0){
				inBX(1,-L[i]);
				inBY(1,L[i]);
				if(pos<N){
					inBX(pos+1,L[i]);
					inBY(pos+1,-L[i]);
				}
			}
		}else{
			pos=searchD2(X[i]);
			if(pos<N){
				inBX(pos+1,L[i]);
				inBY(pos+1,L[i]);
			}
		}
	}
	for(int i=1;i<N+1;++i){
		cout<<outBY(i)<<endl;
	}



	return 0;
}