#include <bits/stdc++.h>
using namespace std;

template <typename T> void setmax(T& a, T b) {
	if (b > a) a = b;
}
template <typename T> void setmin(T& a, T b) {
	if (b < a) a = b;
}

using ll = long long;
const ll INF = 1e18;

const int MAXN = 1.1e5;
int N, Q;
ll A[MAXN];
ll B[MAXN];

const int S = 250;
const int MAXC = MAXN / S + 10;

pair<ll, ll> evts[MAXN];
ll pref[MAXN];
ll suff[MAXN];

struct range_t {
	int l, r;
	ll val;
	
	range_t(int l_, int r_) : l(l_), r(r_), val(0) {
		// initialize here

		for (int i = l; i < r; i++) {
			evts[i] = {B[i] - A[i], B[i]};
		}
		sort(evts + l, evts + r);

		{
			ll curVal = INF;
			for (int i = l; i < r; i++) {
				setmin(curVal, evts[i].second - evts[i].first);
				pref[i] = curVal;
			}
		}
		{
			ll curVal = INF;
			for (int i = r-1; i >= l; i--) {
				setmin(curVal, evts[i].second);
				suff[i] = curVal;
			}
		}
	}

	void add(int d) {
		val += d;
	}

	void finalize() {
		for (int i = l; i < r; i++) {
			A[i] += val;
		}
	}

	ll query() {
		int pos = int(lower_bound(evts + l, evts + r, make_pair(val, 0ll)) - evts);
		ll ans = INF;
		if (l < pos) {
			setmin(ans, pref[pos-1] + val);
		}
		if (pos < r) {
			setmin(ans, suff[pos]);
		}
		return ans;
	}
};

struct query_t {
	int t, l, r, x;
};

int main() {
	ios::sync_with_stdio(0), cin.tie(0);

	cin >> N >> Q;
	for (int i = 0; i < N; i++) {
		cin >> A[i] >> B[i];
	}

	for (int st = 0; st < Q; st += S) {
		int M = min(Q, st+S) - st;
		vector<query_t> queries(M);
		vector<int> pts; pts.reserve(2*M);
		for (auto& it : queries) {
			cin >> it.t >> it.l >> it.r;
			it.l--;
			if (it.t == 1) {
				cin >> it.x;
			} else if (it.t == 2) {
				// do nothing
			} else assert(false);
			pts.push_back(it.l);
			pts.push_back(it.r);
		}

		sort(pts.begin(), pts.end());
		pts.erase(unique(pts.begin(), pts.end()), pts.end());

		int K = int(pts.size());
		assert(K > 1);
		vector<range_t> range; range.reserve(K-1);
		for (int i = 0; i+1 < K; i++) {
			range.push_back(range_t(pts[i], pts[i+1]));
		}

		for (auto it : queries) {
			int l = int(lower_bound(pts.begin(), pts.end(), it.l) - pts.begin());
			int r = int(lower_bound(pts.begin(), pts.end(), it.r) - pts.begin());
			if (it.t == 1) {
				for (int i = l; i < r; i++) {
					range[i].add(it.x);
				}
			} else if (it.t == 2) {
				ll ans = INF;
				for (int i = l; i < r; i++) {
					setmin(ans, range[i].query());
				}
				cout << ans << '\n';
			} else assert(false);
		}

		for (int i = 0; i+1 < K; i++) {
			range[i].finalize();
		}
	}

	return 0;
}
