Pagini recente » Cod sursa (job #1557962) | Cod sursa (job #2544128) | Cod sursa (job #41013) | Cod sursa (job #368799) | Cod sursa (job #368404)
Cod sursa(job #368404)
# include <stdio.h>
int a[20000],is[40000],id[40000],st[40000],dr[40000],p,u,n,mij,s[40000],x,y,sumf,i,l,k,q;
void crearearb ()
{
is[1]=1;
id[1]=n;
p=1;
u=1;
while (p<=u)
{
if (is[p]<id[p])
{
mij=(is[p]+id[p])/2;
u++;
st[p]=u;
is[u]=is[p];
id[u]=mij;
u++;
dr[p]=u;
is[u]=mij+1;
id[u]=id[p];
}
if (is[p]==id[p])
s[p]=a[is[p]];
p++;
}
}
void sum (int nod)
{
if (st[nod]!=0 || dr[nod]!=0)
{
sum (st[nod]);
sum (dr[nod]);
}
if (s[nod]==0)
s[nod]=s[st[nod]]+s[dr[nod]];
}
void inter (int nod)
{
int mij;
if (is[nod]>=x && id[nod]<=y)
{
sumf=s[nod]+sumf;
}
else
{
mij=(is[nod]+id[nod])/2;
if (x<=mij)
inter (st[nod]);
if (y>mij)
inter (dr[nod]);
}
}
void schimba (int nod)
{
int mij=(is[nod]+id[nod])/2;
if (is[nod]==x && id[nod]==x)
{
s[nod]=s[nod]-y;
a[x]=a[x]-y;
}
else
{
if (x<=mij)
schimba (st[nod]);
else
schimba (dr[nod]);
s[nod]=s[st[nod]]+s[dr[nod]];
}
}
int main ()
{
freopen ("datorii.in","r",stdin);
freopen ("datorii.out","w",stdout);
scanf ("%i%i",&n,&k);
for (i=1;i<=n;i++)
scanf ("%i",&a[i]);
crearearb ();
sum (1);
for (i=1;i<=k;i++)
{
scanf ("%i%i%i",&l,&x,&y);
if (l==1)
{
sumf=0;
if (x==y)
sumf=a[x];
else
inter (1);
printf ("%i\n",sumf);
}
else
schimba (1);
}
return 0;
}