#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

/*
const int INF   = 1 << 29;
const int MAX_N = 1000001;

// Segment Tree
// (数列のサイズ N に対してSegment Treeの頂点は 2*N-1 となる)
struct Seg_tree{
	int n;
	vector<int> dat;
	// コンストラクタで初期化
	Seg_tree(int n_){
		// 簡単のために要素数を2のべき乗にする 
		n = 1;
		while( n < n_ ) n *= 2;
		// すべての頂点の値を -INF にする
		for(int i = 0; i < 2 * n - 1; i++){
			dat.push_back(-INF);
		}
	}
	// k 番目の値 (0-indexed) を a に更新
	void update(int k, int a){
		k += n - 1;
		dat[k] = a;
		// 登りながら更新
		while( k > 0 ){
			k = (k - 1) / 2;
			dat[k] = max(dat[k * 2 + 1], dat[k * 2 + 2]);
		}
	}
	// [a,b)の最小値を求める
	int query(int a, int b, int k=0, int l=0, int r=-INF){
		// 初回呼び出し時
		if( k == 0 && l == 0 && r == -INF ) r = n;
		
		// [a,b) と [l,r) が交差しないとき
		if( r <= a || b <= l ) return -INF;
		
		// [a,b) が [l,r) を完全に含んでいるとき
		if( a <= l && r <= b ){
			return dat[k];
		}else{ // それ以外
			int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
			int vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
			return max(vl, vr);
		}
	}
};
*/

// s[k] := k匹釣った人の集合
set<int> s[500001];
// id[k] := 番号 k の人が釣った数
int id[1000000] = {0};

int main(){
	int n, q, x = 0, y = 0;
	cin >> n >> q;
	
	for(int i = 0; i < n; i++) s[0].insert(i);
	
	for(int i = 0; i < q; i++){
		int a, v;
		cin >> a >> v;
		a--;
		int prev = id[a];
		int next = id[a] + v;
		x = min(x, next);
		y = max(y, next);
		s[prev].erase(a);
		s[next].insert(a);
		for(int k = y; k >= x; k--){
			if( s[k].size() ){
				cout << ((*s[k].begin()) + 1) << " " << k << endl;
				break;
			}else{
				y = k;
			}
		}

		id[a] = next;
	}
}