Write a program which manipulates a sequence $A$ = {$a_0, a_1, ..., a_{n-1}$} with the following operations:

* $add(s, t, x)$ : add $x$ to $a_s, a_{s+1}, ..., a_t$.
* $find(s, t)$ : report the minimum value in $a_s, a_{s+1}, ..., a_t$.



Note that the initial values of $a_i ( i = 0, 1, ..., n-1 )$ are 0.

Constraints

* $1 ≤ n ≤ 100000$
* $1 ≤ q ≤ 100000$
* $0 ≤ s ≤ t < n$
* $-1000 ≤ x ≤ 1000$

Input


$n$ $q$
$query_1$
$query_2$
:
$query_q$


In the first line, $n$ (the number of elements in $A$) and $q$ (the number of queries) are given. Then, $i$th query $query_i$ is given in the following format:


0 $s$ $t$ $x$


or


1 $s$ $t$


The first digit represents the type of the query. '0' denotes $add(s, t, x)$ and '1' denotes $find(s, t)$.

Output

For each $find$ query, print the minimum value.

Example

Input

6 7
0 1 3 1
0 2 4 -2
1 0 5
1 0 1
0 3 5 3
1 3 4
1 0 5


Output

-2
0
1
-1
#include <bits/stdc++.h>
using namespace std;

struct RLAQ{
  int sst[1<<18];
  int adt[1<<18];
  RLAQ(){
    fill(sst,sst+(1<<18),0);
    fill(adt,adt+(1<<18),0);
  }
  void add(int p, int q, int x, int k=0, int l=0, int r=(1<<17)){
    if(r <= p || q <= l) return;
    if(p <= l && r <= q){
      adt[k] += x;
      return;
    }
    add(p, q, x, 2*k+1, l, (l+r)/2);
    add(p, q, x, 2*k+2, (l+r)/2, r);
    sst[k]=min(sst[2*k+1]+adt[2*k+1],sst[2*k+2]+adt[2*k+2]);
  }
  int find(int p, int q, int k=0, int l=0, int r=(1<<17)){
    if(r <= p || q <= l) return INT_MAX;
    if(p <= l && r <= q) return sst[k]+adt[k];
    int m1, m2;
    m1 = find(p,q,2*k+1,l,(l+r)/2);
    m2 = find(p,q,2*k+2,(l+r)/2,r);
    return min(m1,m2)+adt[k];
  }
};

int main(){
  RLAQ a;
  int c,x,y,n,q;
  cin>>n>>q;
  for(int i=0;i<q;i++){
    cin>>c;
    if(!c){
      cin>>x>>y>>c;
      a.add(x,y+1,c);
    }
    else{
      cin>>x>>y;
      cout<<a.find(x,y+1)<<endl;
    }
  }
}
