Pagini recente » Cod sursa (job #882440) | Cod sursa (job #681149) | Cod sursa (job #1878234) | Cod sursa (job #1528450) | Cod sursa (job #1639289)
#include <iostream>
#include <fstream>
#define MAX 20000
using namespace std;
ifstream f ("datorii.in");
ofstream g ("datorii.out");
int n,m,Start,Finish,suma,SumArb[100*MAX],Val,Pos,x;
void Form (int nod, int left, int right)
{
if (left==right)
{
SumArb[nod]=Val;
return;
}
int div=(left+right)/2;
if (Pos<=div) Form(2*nod,left, div);
else Form(2*nod+1, div+1, right);
SumArb[nod]=SumArb[2*nod]+SumArb[2*nod+1];
}
void Query(int nod, int left, int right)
{
if (left>=Start&& right<=Finish)
{
suma+=SumArb[nod];
return;
}
int div=(left+right)/2;
if (div>=Start) Query(2*nod, left, div);
if (div<Finish) Query(2*nod+1, div+1, right);
}
int FindNod(int nod, int left, int right)
{
if (left==right) return nod;
int div=(left+right)/2;
if (Pos<=div) return FindNod(2*nod, left, div);
else return FindNod(2*nod+1,div+1, right);
}
void Update(int nod, int x)
{
SumArb[nod]-=x;
if (nod>1) Update(nod/2,x);
}
int main()
{
f>>n>>m;
for (int i=1;i<=n;i++)
{
f>>x;
Pos=i;
Val=x;
Form(1,1,n);
}
for (int i=1;i<=m;i++)
{
int p,a,b;
f>>p>>a>>b;
if (p)
{
Start=a;
Finish=b;
suma=0;
Query(1,1,n);
g<<suma<<'\n';
}
else
{
Pos=a;
Update(FindNod(1,1,n),b);
}
}
return 0;
}