Cod sursa(job #696670)

Utilizator impulseBagu Alexandru impulse Data 28 februarie 2012 19:30:02
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <iostream>
#define ifile "datorii.in", "r"
#define ofile "datorii.out", "w"
#define getf fscanf
#define putf fprintf
using namespace std;
FILE * f=fopen(ifile);
FILE * g=fopen(ofile);
#define NMax 300101
int N, M, A[NMax];

int Zero(int i)
{
    int k = 0;
    while((i & 1) == 0)
    {
        k++;
        i>>=1;
    }
    return 1<<k;
}

int Add(int i, int v)
{
    while(i <= N)
    {
        A[i] += v;
        i += Zero(i);
    }
    return 0;
}

int Query(int i)
{
    int sum = 0;
    while(i)
    {
        sum += A[i];
        i -= Zero(i);
    }
    return sum;
}

int Sum(int i, int j)
{
    return (Query(j) - Query(i-1));
}

int op0(int t, int v)
{
    Add(t, -v);
    return 0;
}

int op1(int p, int q)
{
    putf(g, "%d\n", Sum(p, q));
    return 0;
}

int step1()
{
    getf(f, "%d %d", &N, &M);
    for(int i = 1; i <= N; i++)
    {
        int a;
        getf(f, "%d", &a);
        Add(i, a);
    }
    return 0;
}

int step2()
{
    for(int i = 0; i < M; i++)
    {
        int op, a, b;
        getf(f, "%d %d %d", &op, &a, &b);
        if(op) op1(a,b);
        else   op0(a,b);
    }
    return 0;
}

int main()
{
    step1();
    step2();
    return 0;
}