Cod sursa(job #330680)

Utilizator cezarbotolanbotolan cezar cezarbotolan Data 11 iulie 2009 11:14:30
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <stdio.h>
#define N 15050
int n,m;
int v[N],c[N],s[N];
void read()
{
    scanf("%d %d\n",&n,&m);
    int i,nr,t,salv;
    for (i=1; i<=n; i++)
    {
        scanf("%d",&v[i]);
        s[i]=s[i-1]+v[i];
    }
    for (i=1; i<=n; i++)
    {
        nr=0;
        salv=i;
        while (salv%2==0)
        {
            nr++;
            salv/=2;
        }
        t=i-(1<<nr)+1;
        c[i]=s[i]-s[t-1];
    }
}
void update(int ind,int val)
{
    int poz=0;
    while (ind<=n)
    {
        c[ind]=c[ind]+val;
        while(!(ind&(1<<poz)))
            poz++;
        ind=ind+(1<<poz);
        poz++;
    }
}
int query(int dr)
{
    int poz=0,s1=0;
    while (dr>0)
    {
        s1=s1+c[dr];
        while(!(dr&(1<<poz)))
            poz++;
        dr=dr-(1<<poz);
        poz++;
    }
    return s1;
}
void solve()
{
    int i,tip,ind,val,st,dr,s1,s2;
    for (i=1; i<=m; i++)
    {
        scanf("%d",&tip);
        if (tip==0)
        {
            scanf("%d%d",&ind,&val);
            update(ind,-val);
        }
        else
        {
            scanf("%d%d",&st,&dr);
            s1=query(dr);
            s2=query(st-1);
            printf("%d\n",s1-s2);
        }
    }
}
int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    read();
    solve();
    return 0;
}
#include <stdio.h>
#define N 15050
int n,m;
int v[N],c[N],s[N];
void read()
{
	scanf("%d %d\n",&n,&m);
	int i,nr,t,salv;
	for (i=1; i<=n; i++)
	{
		scanf("%d",&v[i]);
		s[i]=s[i-1]+v[i];
	}
	for (i=1; i<=n; i++)
	{
		nr=0;
		salv=i;
		while (salv%2==0)
		{
			nr++;
			salv/=2;
		}
		t=i-(1<<nr)+1;
		c[i]=s[i]-s[t-1];
	}
}
void update(int ind,int val)
{
	int poz=0;
	while (ind<=n)
	{
		c[ind]=c[ind]+val;
		while(!(ind&(1<<poz)))
			poz++;
		ind=ind+(1<<poz);
		poz++;
	}
}
int query(int dr)
{
	int poz=0,s1=0;
	while (dr>0)
	{
		s1=s1+c[dr];
		while(!(dr&(1<<poz)))
			poz++;
		dr=dr-(1<<poz);
		poz++;
	}
	return s1;
}
void solve()
{
	int i,tip,ind,val,st,dr,s1,s2;
	for (i=1; i<=m; i++)
	{
		scanf("%d",&tip);
		if (tip==0)
		{
			scanf("%d%d",&ind,&val);
			update(ind,-val);
		}
		else
		{
			scanf("%d%d",&st,&dr);
			s1=query(dr);
			s2=query(st-1);
			printf("%d\n",s1-s2);
		}
	}
}
int main()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	read();
	solve();
	return 0;
}