#include <fstream.h>
#include <iostream.h>
#define lg 100005
int init[lg],t[4lg+200],a,b,rez;
inline int max(int a,int b)
{
return a>b?a:b;}
//costr arb
void construiesc(int st,int dr,int poz)
{
if (st==dr)
{init[st]=poz;
return ;
}
int x=(st+dr)/2;
construiesc(st,x,2poz);
construiesc(x+1,dr,2poz+1);
}
//**ACTUALIZARE
void actualizare(int poz,int val)
{
int x=init[poz];
t[x]=val;
x>>=1;
while(x)
{t[x]=t[x]+val;
x>>=1;
}
}
void actualizare2(int poz,int val)
{
int x=init[poz];
t[x]=t[x]-val;
x>>=1;
while(x)
{t[x]=t[x]-val;
x>>=1;
}
}
//**INTEROGARE
void interogare(int st,int dr,int poz)
{
if (st>b||dr<a) return;
if (a<=st&&dr<=b)
rez=rez+t[poz];
else
if (st<dr)
{int x=(st+dr)/2;
interogare(st,x,poz2);
interogare(x+1,dr,poz2+1);
}
}
int main()
{int i,x,n,m;
ifstream f("datorii.in");
ofstream g("datorii.out");
f>>n>>m;
construiesc(1,n,1);
for(i=1;i<=n;i=i+1)
{f>>x;
actualizare(i,x);
}
//**EFECTUARE TESTE
for(i=1;i<=m;i++)
{
f>>x>>a>>b;
// cout<<"am citit"<<x<<" "<<a<<" "<<b;
//system("pause");
if (x==1)
{rez=0;
interogare(1,n,1);
g<<rez<<"\n";
}
else
if (x==0)
actualizare2(a,b);
}
f.close();
g.close();
return 0;
}
REZOLVARE CU AIB
#include <fstream>
#define zeros(x)((x^(x-1))&x)
#define NMAX 15005
int aib[NMAX];
int n;
void Add(int x,int val)
{
for(int i=x; i<=n; i+=zeros(i))
aib[i]+=val;
}
int Compute(int x)
{
int suma=0;
for(int i=x; i; i-=zeros(i))
suma+=aib[i];
return suma;
}
using namespace std;
ifstream cin("datorii.in");
ofstream cout("datorii.out");
int main()
{
ios_base::sync_with_stdio(0);
cin.tie();
int m,a,q,x,y;
cin>>n>>m;
for(int i=1; i<=n; ++i)
{
cin>>a;
Add(i,a);
}
for(int i=1; i<=m; ++i)
{
cin>>q;
if(q==0)
{
cin>>x>>a;
Add(x,-a);
}
else if(q==1)
{
cin>>x>>y;
cout<<Compute(y)-Compute(x-1)<<"\n";
}
}
return 0;
}
Modificat sursa la prob datorii
#include <fstream>
#include <iostream>
int init[100005],t[100000005],a,b,rez,x;
inline int max(int a,int b)
{
return a>b?a:b;}
void arbore(int st,int dr,int poz)
{
if (st==dr)
{init[st]=poz;
return ;
}
x=(st+dr)/2;
arbore(st,x,2poz);
arbore(x+1,dr,2poz+1);
}
void a1(int poz,int val)
{
int x=init[poz];
t[x]=val;
x>>=1;
while(x)
{t[x]=t[x]+val;
x>>=1;
}
}
void a2(int poz,int val)
{
int x=init[poz];
t[x]=t[x]-val;
x>>=1;
while(x)
{t[x]=t[x]-val;
x>>=1;
}
}
void interogare(int st,int dr,int poz)
{
if (st>b||dr<a) return;
if (a<=st&&dr<=b)
rez=rez+t[poz];
else
if (st<dr)
{int x=(st+dr)/2;
interogare(st,x,poz2);
interogare(x+1,dr,poz2+1);
}
}
int main()
{int i,x,n,m;
ifstream f("datorii.in");
ofstream g("datorii.out");
f>>n>>m;
arbore(1,n,1);
for(i=1;i<=n;i=i+1)
{f>>x;
a1(i,x);
}
for(i=1;i<=m;i++)
{
f>>x>>a>>b;
if (x==1)
{rez=0;
interogare(1,n,1);
g<<rez<<"\n";
}
else
if (x==0)
a2(a,b);
}
f.close();
g.close();
return 0;
}