Cod sursa(job #35519)

Utilizator cos_minBondane Cosmin cos_min Data 22 martie 2007 10:09:58
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <stdio.h>
#include <fstream>
using namespace std;

#define in "datorii.in"
#define out "datorii.out"
#define Dim 15001

long long dat[Dim], n, m, x, y, ok; 
long long arb[2*Dim+2];
long long sum,t,v;

void Q(int nod, int st, int dr, int a, int b);
void Update1(int nod, int st, int dt, int a);
void Update2(int nod, int st, int dt, int a);

int main()
{
    int k;
    int tip,t,v;
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%lld%lld", &n, &k);
    for ( int i = 1; i <= n; i++ ) 
    {
        scanf("%lld",&dat[i]);
        Update1(1,1,n,i);
    }    
    
    for ( int i = 1; i <= k; i++ )
    {
        scanf("%d%lld%lld",&tip,&t,&v);
        if ( tip == 0 )
        {
            dat[t] -= v;
            Update2(1,1,n,t);
        }
        else
        {
            Q(1,1,n,t,v);
            printf("%lld\n",sum);
            sum = 0;
        }  
    }                
}     

void Update2(int nod, int st, int dr, int a)
{
    if ( st == dr )
    {
        arb[nod] = dat[a];
        return;
    }    
    
    int mij = (st+dr)/2;
    if ( a <= mij ) Update2(2*nod,st,mij,a);
    if ( mij < a )  Update2(2*nod+1,mij+1,dr,a);   
    arb[nod] = arb[2*nod+1] + arb[2*nod];
}

void Update1(int nod, int st, int dr, int a)
{
    arb[nod] += dat[a];
   
    if ( st == dr )
    {
        arb[nod] = dat[a];
        return;
    }    
    if ( st < dr )
    {
        int mij = (st+dr)/2;
        if ( a <= mij && 2*nod <= Dim ) Update1(2*nod,st,mij,a);
        if ( a > mij && 2*nod <= Dim )  Update1(2*nod+1,mij+1,dr,a);
    }
}    

void Q(int nod,int st, int dr, int a, int b)
{
    if ( a <= st && dr <= b )
    {
        sum += arb[nod];
        return;
    }
    int mij = (st+dr)/2;
    if ( a <= mij ) Q(2*nod,st,mij,a,b);
    if ( mij < b ) Q(2*nod+1,mij+1,dr,a,b);
}