Pagini recente » Cod sursa (job #2852602) | Cod sursa (job #3285709) | Cod sursa (job #2938618) | Cod sursa (job #3157615) | Cod sursa (job #3138351)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LSB(x) ((x)^((x)&(x-1)))
// LSB(x)=2^k, unde k=nr de 0-ouri din stanga reprezentarii binare..0-ori terminale
#define NMAX 32768
long a[NMAX],m,n,i,x,c1,c2,c,t,v,p,q;
FILE *f=fopen("datorii.in","r");
FILE *g=fopen("datorii.out","w");
void update( long x, long delta)
//adaug la elementul x valoarea delta in O(lg N),
// unde n e dimensiunea AIB-ului.
{
for (; x < NMAX; x+=LSB(x))
a[x]+=delta;
}
int query(int x) //calculez suma elementelor de la 1 la x in O(log N)
{
int ret=0;
for (; x>0; x-=LSB(x))
ret+=a[x];
return ret;
}
int main()
{
fscanf(f,"%ld %ld\n", &n, &m);
memset(a,0,sizeof(a));
for (i=1; i<=n; i++)
{
fscanf(f,"%ld", &x);
update(i,x);
}
for (i=1; i<=m; i++)
{
fscanf(f,"%ld",&x);
if (x==0)
{ // achitare
fscanf(f,"%ld %ld\n",&t,&v);
update(t,-v);
}
else
{ // intrebare
fscanf(f,"%ld %ld\n",&p,&q);
c1=query(q); c2=query(p-1);
c=c1-c2;
fprintf(g,"%ld\n",c);
}
}
return 0;
}