#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll k[500005];int m,n,p;ll a,b,c,ans=0;
int add[500007],pos[500007]/*判断点属于哪一个块*/,sum[500007];
int line_l[500007],line_r[500007];
inline long long read()
{
char cc=getchar();long long f=1,ans=0;
while(cc<'0' or cc>'9'){if(cc=='-')f=-1;cc=getchar();}
while(cc>='0' and cc<='9'){ans=(ans*10)+(cc-'0');cc=getchar();}
return f*ans;
}
inline void reads(){n=read();m=read();for(int i=1;i<=n;i++)k[i]=read();}
inline void build()
{
int t=sqrt(n);//块的个数
for(int i=1;i<=t;i++){line_l[i]=(i-1)*t+1;line_r[i]=i*t;}//设置左右边界
if(line_r[t]<=n){t++;line_l[t]=line_r[t]+1;line_r[t]=n;}//特判最后一个块不完整
for(int i=1;i<=t;i++)//初始化区间加值和这个点属于那个块
for(int j=line_l[i];j<=line_r[i];j++){pos[j]=i;sum[i]+=k[j];}
}
inline void change_point(){a=read();b=read();k[a]+=b;}
inline void change_line()
{
a=read();b=read();
if(pos[a]==pos[b]){for(int i=a;i<=b;i++)ans+=k[i];printf("%d\n",ans);return ;}
for(int i=pos[a]+1;i<=pos[b]-1;i++)ans+=sum[i];
for(int i=a;i<=line_r[a];i++)ans+=k[i];for(int i=line_l[b];i<=b;i++)ans+=k[i];
printf("%d\n",ans);return ;
// printf("%d",ans);printf("\n");
}
inline void main_d()
{reads();for(int i=1;i<=m;i++){ans=0;p=read();if(p==1){change_point();continue;}change_line();}}
int main()
{
main_d();
return 0;
}