Cod sursa(job #1446653)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 2 iunie 2015 15:35:11
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#define Dim 50000

int Tree[Dim],N,M,X,Y,Op,Sol;

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

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
     scanf("%d%d",&N,&M);

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

     for (int i = 1;i <= M;i++)
     {
         scanf("%d%d%d",&Op,&Y,&X);
         if (Op == 0) Update(1,1,N);
        else
        {
            Sol = 0;
            Query(1,1,N);
            printf("%d\n",Sol);
        }
     }
    return 0;
}

void Update(int Node,int Left,int Right)
{
    if (Left == Right)
    {
        if (Tree[Node] == 0) Tree[Node] = X;
                        else Tree[Node] -= X;
        return;
    }

    int Med = (Left + Right) / 2;
    if (Y <= Med) Update(2*Node,Left,Med);
             else Update(2*Node+1,Med+1,Right);

    Tree[Node] = Tree[2*Node] + Tree[2*Node+1];
}

void Query(int Node,int Left,int Right)
{
    if (Y <= Left && Right <= X)
    {
        Sol += Tree[Node];
        return;
    }

    int Med = (Left + Right) / 2;
    if (Y <= Med) Query(2*Node,Left,Med);
    if (Med < X)  Query(2*Node+1,Med+1,Right);
}