Pagini recente » Cod sursa (job #3128540) | Cod sursa (job #1158086) | Cod sursa (job #553364) | Cod sursa (job #235730) | Cod sursa (job #932364)
Cod sursa(job #932364)
#include <fstream>
#define In "datorii.in"
#define Out "datorii.out"
#define NMAX 15000
using namespace std;
int AIB[NMAX+2],n;
/*
AIB[i] = suma elementelor dintre i-2^k+1 si i
k = numarul de zerouri terminale din reprezentarea binara a lui i
k = i&(-i);
*/
//creste intervalele care il contin pe poz cu i
inline void Update(int poz,int val)
{
while(poz<=n)
{
AIB[poz]+=val;
poz+=poz&(-poz);
}
}
//returneaza suma elementelor de la 1 la poz
inline int Query(int poz)
{
int sum = 0;
while(poz>0)
{
sum+=AIB[poz];
poz-=poz&(-poz);
}
return sum;
}
int main()
{
int i,m,s1,s2,p,q,x;
bool op;
ifstream fin(In);
ofstream fout(Out);
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin>>x;
Update(i,x);
}
for(i=1;i<=m;i++)
{
fin>>op>>p>>q;
if(op)
{
s1 = Query(q);
s2 = Query(p-1);
fout<<s1-s2<<"\n";
}
else
Update(p,-q);
}
fin.close();
fout.close();
return 0;
}