Cod sursa(job #1307633)

Utilizator andreismara97Smarandoiu Andrei andreismara97 Data 2 ianuarie 2015 17:06:37
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<cstdio>
using namespace std;

#define Nmax 15001

int MaxArb[Nmax*4+100];
int Nr[Nmax];
int N, Q, pos, val, start, finish, suma;

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

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

    int x,A,B;

    scanf("%d %d\n",&N,&Q);
    for(int i=1;i<=N;i++)
    {
        scanf("%d ",&x);
        Nr[i]=x;
        pos=i;   val=x;
        Update(1,1,N);
    }

    for(int i=1;i<=N;i++)
    {
        scanf("%d %d %d\n",&x,&A,&B);
        if(x==0)
        {
            pos=A;  val=Nr[A]-B;    Nr[A]=val;
            Update(1,1,N);
        }
        else
        {
            suma=0;
            start=A;  finish=B;
            Query(1,1,N);

            printf("%d\n",suma);
        }
    }

}

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

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

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

void Query(int nod,int left, int right)
{
    if( start <= left && right<=finish)
    {
        suma+=MaxArb[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);
}