Pagini recente » Diferente pentru problema/foametea intre reviziile 82 si 24 | Diferente pentru utilizator/alecman intre reviziile 28 si 27 | Atasamentele paginii Profil TheNamelessOne | Diferente pentru problema/convertor intre reviziile 29 si 28 | Cod sursa (job #1721167)
#include <fstream>
#define nmax 15005
using namespace std;
unsigned long long abi[nmax];
unsigned short v[nmax];
unsigned int n;
void add(unsigned int i)
{
unsigned int x=i;
while (x<=n)
{
abi[x]+=v[i];
x+=(x&(-x));
}
}
void setv(unsigned int i, unsigned int val)
{
unsigned int x=i;
while (x<=n)
{
abi[x]-=v[i];
abi[x]+=val;
x+=(x&(-x));
}
}
unsigned long long getsum(unsigned int i)
{
unsigned int x=i;
unsigned long long sum=0;
while (x)
{
sum+=abi[x];
x&=(x-1);
}
return sum;
}
int main()
{
ifstream f("datorii.in");
ofstream g("datorii.out");
unsigned int i,m,x,y,op;
unsigned long long rez;
f>>n>>m;
for (i=1;i<=n;i++)
{
f>>v[i];
if (v[i]) add(i);
}
for (i=1;i<=m;i++)
{
f>>op>>x>>y;
if (!op)
{
setv(x,v[x]-y);
v[x]-=y;
}
else
{
rez=getsum(y)-getsum(x-1);
g<<rez<<'\n';
}
}
f.close();
g.close();
return 0;
}