Cod sursa(job #955622)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 1 iunie 2013 10:58:55
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>
#include<string.h>

#define NMAX 15007

int Arbi[3 * NMAX];
int A[NMAX] , a , x , y , poz , Ans , n , Q , Tip;

void update(int nod , int st , int dr , int aa)
{
    if(st == dr)
    {
        if(aa == 0)
            Arbi[nod] -= a;
        else
            Arbi[nod] = a;
        return ;
    }
    int med = (st + dr) >> 1;
    if(med >= poz)
        update(2 * nod , st , med , aa);
    else
        update(2 * nod + 1 , med + 1 , dr , aa);
    Arbi[nod] = Arbi[2 * nod] + Arbi[2 * nod + 1];
}

void query(int nod , int st , int dr , int x , int y)
{
    if(st >= x && dr <= y)
    {
        Ans += Arbi[nod];
        return ;
    }
    int med = (st + dr) >> 1;
    if(med >= x)
        query(2 * nod , st , med , x , y);
    if(med < y)
        query(2 * nod + 1 , med + 1 , dr , x , y);
}

void afis()
{
    for(int i = 1 ; i <= n + 10; ++ i)
        printf("%d " , Arbi[i]);
    printf("\n");
}

int main()
{
    freopen("datorii.in" , "r" , stdin);
    freopen("datorii.out" , "w" , stdout);
    scanf("%d %d" , &n , &Q);
    for(int i = 1 ; i <= n ; ++ i)
    {
        scanf("%d" , &A[i]);
        a = A[i];
        poz = i;
        update(1 , 1 , n , 1);
        ///afis();
    }
    ///afis();
    for(int i = 1 ; i <= Q ; ++ i)
    {
        scanf("%d %d %d" , &Tip , &poz , &a);
        if(Tip == 0)
            update(1 , 1 , n , 0);/// , afis();
        else
        {
            Ans = 0;
            query(1 , 1 , n , poz , a);
            printf("%d\n" , Ans);
        }
    }
}