#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_DEPRECATE

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <cfloat>
#include <ctime>
#include <cassert>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
#include <numeric>
#include <list>
#include <iomanip>
#include <fstream>


using namespace std;
const int MOD = 1000000009; // check!!!
const int INF = 100000000; //1e8

typedef long long ll;
typedef pair<int,int> Pii;
typedef pair<ll,ll> Pll;

#define FOR(i,n) for(int i = 0; i < (n); i++)
#define sz(c) ((int)(c).size())
#define ten(x) ((int)1e##x)
#define tenll(x) ((ll)1e##x)

//0-indexed
//       k
//     /   \
// 2k+1     2k+2
// kの親は (k-1)/2
// //calc に、動作を変更するべきソースが書いてある
class seg_tree{

public:

	vector<Pll> dat;
	int n;

	void init(int* d,int size){

		n = 1;
		while(n < size) n <<= 1;

		dat.resize(2 * n - 1);
		fill(dat.begin(),dat.end(),Pll(-1,-(1LL<<60)));

		FOR(i,size) dat[n-1+i].first = i;
		FOR(i,size) dat[n-1+i].second = d[i];

		for(int i = n / 2; i > 0; i /= 2){
			for(int s = i - 1; s <= 2 * (i - 1); s++){
				dat[s].first = dat[s * 2 + 1].second >= dat[s * 2 + 2].second ? dat[s*2+1].first : dat[s*2+2].first;
				dat[s].second = max(dat[s * 2 + 1].second,dat[s * 2 + 2].second); //calc
			}
		}
	}

	//k番目(0-indexed)をvalに更新
	void update(int k,int val){
		k += n-1;
		dat[k].second += val;
		while(k > 0){
			k = (k-1)/2;
			dat[k].first = dat[k*2+1].second >= dat[k*2+2].second ? dat[k*2+1].first : dat[k*2+2].first;
			dat[k].second = max(dat[k*2+1].second,dat[k*2+2].second); //calc
		}
	}

	//[a,b)において求めたい値を得る
	Pll query(int a,int b)
	{
		return query(a,b,0,0,n);
	}

	//[a,b)において求めたい値を得る
	// k = 現在見ている接点の番号
	// [l,r)はkに対応した範囲
	Pll query(int a,int b,int k,int l,int r)
	{
		if(r <= a || b <= l) return Pll(-1,-(1LL<<60)); //範囲外
		if(a <= l && r <= b) return dat[k]; //[l,r) ⊂ [a,b)

		//[l,r)の一部が[a,b)に含まれる
		int md = (l + r) / 2; //[l,md),[md,r)
		int nl = k * 2 + 1,nr = nl + 1; //子の接点
		Pll lval = query(a,b,nl,l , md);
		Pll rval = query(a,b,nr,md , r);

		ll retl = lval.second >= rval.second ? lval.first : rval.first;
		ll retr = max(lval.second,rval.second);

		return Pll(retl,retr); //calc
	}
};


int main(){

	int n,q; cin>>n>>q;

	seg_tree st;
	static int a[1000000] = {};
	st.init(a,n);

	FOR(i,q){
		int a,v; cin>>a>>v;
		a--;
		st.update(a,v);
		Pll ans = st.dat[0];
		printf("%lld %lld\n",ans.first + 1,ans.second);
	}

	return 0;
}