Pagini recente » Cod sursa (job #204175) | Cod sursa (job #1828198)
#include<cstdio>
using namespace std;
struct arbint{int val,st,dr;};
arbint aint[60001];
int pown(int n)
{
int s=1;
while(s<n)
{
s*=2;
}
return s;
}
void build(int i)
{
if(aint[i].st!=0)
return;
build(i+i);
build(i+i+1);
aint[i].val=aint[i+i].val+aint[i+i+1].val;
aint[i].st=aint[i+i].st;
aint[i].dr=aint[i+i+1].dr;
}
int query(int i,int st,int dr)
{
if(aint[i].st>=st&&dr>=aint[i].dr)
return aint[i].val;
int s=0,mid=aint[i+i].dr;
if(dr>=mid+1)
s+=query(i+i+1,st,dr);
if(st<=mid)
s+=query(i+i,st,dr);
return s;
}
void update(int i,int poz,int val)
{
if(aint[i].st==aint[i].dr)
{
aint[i].val-=val;
return;
}
int mid=aint[i+i].dr;
if(poz<=mid)
update(i+i,poz,val);
if(poz>mid)
update(i+i+1,poz,val);
aint[i].val=aint[i+i].val+aint[i+i+1].val;
}
int main()
{
freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
int n,m,i,pn,c,a,b;
scanf("%d%d",&n,&m);
pn=pown(n);
for(i=1;i<=n;i++)
{
scanf("%d",&aint[pn-1+i].val);
}
for(i=1;i<=pn;i++)
{
aint[pn-1+i].st=i;
aint[pn-1+i].dr=i;
}
build(1);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&c,&a,&b);
if(c==1)
{
printf("%d\n",query(1,a,b));
}
else
{
update(1,a,b);
}
}
return 0;
}