Cod sursa(job #563332)

Utilizator Sm3USmeu Rares Sm3U Data 24 martie 2011 22:26:03
Problema Datorii Scor 100
Compilator cpp Status done
Runda gm_1 Marime 1.55 kb
#include <stdio.h>
#include <string.h>

using namespace std;

int n;
int m;
int *a;
int *b;
int A;
int B;
int suma;

void cauta(int st, int dr, int nod)
{
    if(st>=A && dr<=B)
    {
        suma+=b[nod];
        return;
    }
    int mij=(st+dr)>>1;
    int x=nod<<1;
    if(B > mij)
    {
        cauta(mij+1,dr,x+1);
    }
    if(A <= mij)
    {
        cauta(st,mij,x);
    }
}

void build(int st, int dr, int nod)
{
    if(st==dr)
    {
        b[nod]=a[st];
        return;
    }
    int mij=(st+dr)>>1;
    int x=nod<<1;
    build(st,mij,x);
    build(mij+1,dr,x+1);

    b[nod]=b[x]+b[x+1];
}

void add(int st, int dr, int nod)
{
    if(st==dr && st==A)
    {
        b[nod]-=B;
        return;
    }
    int mij=(st+dr)>>1;
    int x=nod<<1;
    if(A > mij)
    {
        add(mij+1,dr,x+1);
    }
    if(A <= mij)
    {
        add(st,mij,x);
    }
    b[nod]=b[x]+b[x+1];
}

void citire()
{
    scanf("%d %d",&n,&m);
    a=new int[n+5];
    b=new int[4*n];
    memset(b,0,sizeof(b));
    memset(a,0,sizeof(a));

    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    citire();
    build(1,n,1);
    for(int i=0;i<m;i++)
    {
        int x;
        scanf("%d %d %d",&x,&A,&B);
        if(x)
        {
            suma=0;
            cauta(1,n,1);
            printf("%d\n",suma);
        }
        else
        {
            add(1,n,1);
        }
    }

    return 0;
}