Cod sursa(job #825597)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 29 noiembrie 2012 11:40:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <cstdlib>
#define MAX_SIZE 15000

using namespace std;

ifstream input("datorii.in");
ofstream output("datorii.out");

int arb[MAX_SIZE * 3];
int sume[MAX_SIZE+1];
int sum = 0;



void update_tree(int nod , int value , int pozition , int left , int right)
{
    if (left == right)
    {
        arb[nod] = value;
        return ;
    }
    int middle = (left + right) / 2;
    if (pozition<= middle) update_tree(2*nod , value ,pozition , left,middle);
    else update_tree(2*nod+1 , value , pozition , middle+1 , right);

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




void query_tree(int nod , int P , int Q , int left , int right)
{
    if ( P <= left && Q >= right )
    {
        sum += arb[nod];
        return;
    }
    int middle = (left + right) / 2;
    if (P <= middle) query_tree(2*nod , P , Q , left , middle);
    if (Q > middle) query_tree(2*nod + 1 , P , Q , middle + 1  , right);
}


int main()
{
    int N , Queries;
    input >> N >> Queries;
    for (int i = 1 ;i <= N ; i++)
    {
        int x;
        input >> x;
        sume[i] = x;
        update_tree(1,x,i,1,N);
    }

    for (int i = 0 ;i < Queries;i++)
    {
        int x;
        input >> x;
        if (x == 0)
        {
            int poz;
            int T;
            input >> poz >> T;
            sume[poz] -= T;
            update_tree(1,sume[poz],poz,1,N);
        }
        if (x == 1)
        {
            int P;
            int Q;
            input >> P >> Q;
            sum = 0;
            query_tree(1,P,Q,1,N);
            output << sum << "\n";
        }

    }
    input.close();
    output.close();
    return 0;
}