Cod sursa(job #1314681)

Utilizator andreismara97Smarandoiu Andrei andreismara97 Data 12 ianuarie 2015 09:53:49
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<algorithm>
#include<cstdio>
using namespace std;

#define Nmax 100005
int Arb[Nmax*2]={0}, N, Q, pos, val, start, finish, suma=0;

void Update(int,int,int);
void Query(int,int,int);

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

    scanf("%d %d\n",&N,&Q);

    int x, A, B;

    for(int i=1;i<=N;i++)
    {
        scanf("%d ",&x);
        pos=i; val=x;
        Update(1,1,N);
    }

    for(int i=1; i<=Q; i++)
    {
        scanf("%d ",&x);
        if(x == 0)
        {
            scanf("%d %d\n",&A,&B);
            pos=A; val=B;
            Update(1,1,N);
        }
        if(x == 1)
        {
            scanf("%d %d\n",&A,&B);
            start=A;    finish=B; suma=0;
            Query(1,1,N);
            printf("%d\n",suma);
        }
        if(x == 2)
        {
            scanf("%d\n",&A);
        }
    }
    /*for(int i=1;i<=2*N;i++)
        printf("%d ",Arb[i]);
        printf("%f ",(float)sizeof(Arb)/(1024*1024));*/
}

void Update(int nod, int left, int right)
{
    if(left == right)
    {
        Arb[nod]+= val;
        return;
    }

    int mijl = (right+left)/2;
    if( pos <= mijl )   Update (nod*2,  left,   mijl);
    else                Update (nod*2+1,mijl+1, right);

    Arb[nod]=Arb[nod*2]+Arb[nod*2+1];
}

void Query(int nod, int left, int right)
{
    if(start<= left && right<=finish)
    {
        suma+=Arb[nod];
        return;
    }

    int mijl= (right + left)/2;
    if( start <= mijl)      Query(nod*2,  left,   mijl);
    if( mijl  < finish)     Query(nod*2+1,mijl+1, right);
}