#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct AB{
int l,r,lazy;
int value,sum,max,min;
bool vist;
bool leave;
}listTree[80000];
int n,value[20000],q,k,l,r,i,treeLength,link[4],linktot;
int max(int a,int b)
{
return a > b ? a : b;
}
void buildTree(int link,int l,int r)
{
if(l>r) return ;
listTree[link].l = l;
listTree[link].r = r;
if(l==r)
{
treeLength = max(treeLength,link);
listTree[link].vist = false;
listTree[link].leave = true;
listTree[link].value = listTree[link].max = listTree[link].min = listTree[link].sum = value[l];
return ;
}
buildTree(link*2,l,(l+r)/2);
buildTree((link*2)+1,(l+r)/2+1,r);
return ;
}
void printTree()
{
int tot=0;
while(++tot<=treeLength&&listTree[tot].l)
printf("[%d,%d] sum:%d vist:%d\n",listTree[tot].l,listTree[tot].r,listTree[tot].sum,listTree[tot].vist);
return ;
}
int _treeSum(int link)
{
if(link == 0)
return 0;
if(listTree[link].leave)
return listTree[link].value;
if(!listTree[link].sum)
listTree[link].sum = _treeSum(link*2)+_treeSum(link*2+1);
return listTree[link].sum;
}
int treeSum(int tot)
{
int sum = 0;
while(tot-->=0)
{
sum += link[tot] ? _treeSum(link[tot]) : 0;
listTree[link[tot]].vist = false;
}
return sum;
}
int findlink(int comperl,int comperr,bool mainLR,int link)
{
if(comperl>n||comperr>n||comperl<1||comperr<1)
return 0;
if(listTree[link].vist)
return 0;
if(comperl>comperr)
return 0;
if(mainLR)
{
if(comperr==listTree[link].r)
{
if(comperl<=listTree[link].l)
{
listTree[link].vist = true;
return link;
}
else
return findlink(comperl,comperr,true,link*2+1);
}
if(comperr<=(listTree[link].l+listTree[link].r)/2)
return findlink(comperl,comperr,true,link*2);
else
return findlink(comperl,comperr,true,link*2+1);
}
else
{
if(comperl==listTree[link].l)
{
if(comperr>=listTree[link].r)
{
listTree[link].vist = true;
return link;
}
else
return findlink(comperl,comperr,false,link*2);
}
if(comperl<=(listTree[link].l+listTree[link].r)/2)
return findlink(comperl,comperr,false,link*2);
else
return findlink(comperl,comperr,false,link*2+1);
}
return 0;
}
void searchLink(int l,int r)
{
if(l>r)
return ;
int ans;
ans = findlink(l,r,false,1);
if(ans > 0)
{
link[linktot] = ans;
linktot++;
}
ans = findlink(l,r,true,1);
if(ans > 0)
{
link[linktot] = ans;
linktot++;
}
searchLink(l+1,r-1);
return ;
}
int _swap(int a,int b)
{
return a>b;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&value[i]);
buildTree(1,1,n);
while(q--)
{
scanf("%d%d%d",&k,&l,&r);
if(k==1)
{
scanf("%d",&k);
for(i=l;i<=r;i++)
value[i] += k;
buildTree(1,1,n);
}
else
{
if(l>n||r>n||l<1||r<1)
continue;
linktot = 0;
searchLink(l,r);
sort(link,link+linktot,_swap);
printf("%d",treeSum(unique(link,link+linktot)-link));
printf("\n");
}
}
return 0;
}