Cod sursa(job #153742)

Utilizator cretuMusina Rares cretu Data 10 martie 2008 18:28:07
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#define MAX 15001

using namespace std;

int d[100*MAX], m, n, sum;

void Update(int nod, int st, int dr, int p, int v);
void Querry(int nod, int st, int dr, int a, int b);

int main()
{
    int i, x1, x2, q, op;
    
    FILE * fin = fopen("datorii.in", "r");
    FILE * fout = fopen("datorii.out", "w");
    
    fscanf(fin, "%d %d", &n, &m);
    
    for (i = 1; i <= n; i++)
    {
        fscanf(fin, "%d", &x1);  
        Update(1, 1, n, i, x1);
    }
        
    for (q = 1; q <= m; q++)
    {
        fscanf(fin, "%d %d %d", &op, &x1, &x2);
        if (op == 0) Update(1, 1, n, x1, -x2);
        else 
        {
             sum = 0;
             Querry(1, 1, n, x1, x2);
             fprintf(fout, "%d\n", sum);     
        }
    }
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}

void Update(int nod, int st, int dr, int p, int v)
{
     if (st == dr)
     {
         d[nod] += v;
         return;       
     }     
     int mijl = (st+dr)/2;
     
     if (p <= mijl) Update(2*nod, st, mijl, p, v);
     else           Update(2*nod+1, mijl+1, dr, p, v);
     
     d[nod] += v;
}

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