Pagini recente » Cod sursa (job #2857444) | Cod sursa (job #1849966) | Cod sursa (job #1995720) | Cod sursa (job #2079570) | Cod sursa (job #199907)
Cod sursa(job #199907)
#include<iostream.h>
#include<stdio.h>
#include<math.h>
long v[4000], c[4000], rez[4000];
long i, j, bin, aux, k, n, m, s, suma1, suma2, f, l, modif, poz, val, t;
long nrzero(long i)
{ bin=0;
while(i!=0)
{
if(i%2==0)
bin++;
else
return bin;
i=i/2;
}
return bin;
}
void make(long i)
{
bin=nrzero(i);
k=pow(2, bin);
for(j=i-k+1;j<=i;j++)
c[i]=c[i]+v[j];
}
int main()
{
freopen("datorii.in", "r", stdin);
freopen("datorii.out", "w", stdout);
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>v[i];
make(i);
}
for(l=1;l<=n;l++)
{ cin>>modif>>poz>>val;
suma1=suma2=0;
if(modif==0)
{ // se modifica valoarea achitata in ziua poz, dar si in zilele care contin pe poz,din vect c
t=poz;
c[t]=c[t]-val;
poz=poz+pow(2, nrzero(poz));
while(poz<=m)
{
c[poz]=c[poz]-val;
poz=poz+pow(2, nrzero(poz));
}
}
else
{
// calculam suma achitata in intervalul <poz, val>
// <1, poz-1>
t=poz-1;
while(t>0)
{
suma1=suma1+c[t];
t=t-pow(2, nrzero(t));
}
//<1, val>
t=val;
while(t>0)
{ suma2=suma2+c[t];
t=t-pow(2, nrzero(t));
}
rez[++f]=suma2-suma1;
}
}
for(i=1;i<=f;i++)
cout<<rez[i]<<endl;
return 0;
}