Pagini recente » Cod sursa (job #859788) | Cod sursa (job #464330) | Cod sursa (job #917860) | Cod sursa (job #1499131) | Cod sursa (job #2827303)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int aib[15001];
int n;
int suma(int x)
{
int s=0,p=0;
while (x>=1){
while(x>0)
{
int k=1;
while (k<=x)
k*=2;
k/=2;
x-=k;
p+=k;
s+=aib[p];
}
if (x==1)
return s+aib[p+1];
else
return s;
}
}
int sumaintervale(int x, int y)
{
return suma(y)-suma(x-1);
}
void adaugavaloare(int x,int val)
{
while(x<=n)
{
aib[x]-=val;
int k=1;
int aux=x;
while (aux%2==0)
{
aux/=2;
k*=2;
}
x+=k;
}
}
int main()
{
int m;
in >>n;
in >>m;
int v[n+1];
for (int i=1;i<=n;i++)
{
aib[i]=0;
in >>v[i];
if (i%2==1)
aib[i]=v[i];
}
for (int i=2;i<=n;i+=2)
{
int k=1;
int x=i;
while (x%2==0)
{
x/=2;
k*=2;
}
for (int j=i;j>=i-k+1;j--)
aib[i]+=v[j];
}
for (int i=1;i<=m;i++)
{
int A;
in >>A;
if (A==1)
{
int st,dr;
in >>st>>dr;
out << sumaintervale(st,dr)<<endl;
}
if (A==0)
{
int zi,valoare;
in >> zi >> valoare;
adaugavaloare(zi,valoare);
}
}
return 0;
}