Cod sursa(job #1767568)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 29 septembrie 2016 14:40:30
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <stdlib.h>

#define zero(x) ((x^(x-1))&x)

int n,m,s[100010];

void citire();
void rezolvare();


int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);

    citire();
    rezolvare();
    return 0;
}

void citire()
{
    scanf("%d %d ",&n,&m);
    int i;
    for(i=1;i<=n;i++)
    {
        int val;
        scanf("%d ",&val);
        int j;
        for(j=i;j<=n;j+=zero(j))
            s[j]+=val;
    }
}

void adauga(int p1,int p2)
{
    int i;
    for(i=p1;i<=n;i+=zero(i))
        s[i]+=p2;
}

int suma(int x)
{
    int t=0,i;
    for(i=x;i>=1;i-=zero(i))
        t+=s[i];
    return t;
}

int interog(int p1,int p2)
{
    return suma(p2)-suma(p1-1);
}

void rezolvare()
{
    int i;
    for(i=1;i<=m;i++)
    {
        int op,param1,param2;
        scanf("%d ",&op);
        if(!op)
        {
            scanf("%d %d ",&param1,&param2);
            adauga(param1,-param2);
        }
        else if(op==1)
        {
            scanf("%d %d ",&param1,&param2);
            printf("%d\n",interog(param1,param2));
        }
    }
}