Cod sursa(job #1206353)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 9 iulie 2014 18:35:16
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
using namespace std;

ifstream is("datorii.in");
ofstream os("datorii.out");

int N, M, x, y, z, val, P1, P2, Sum, T;
int Arb[60001];

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

int main()
{
    is >> N >> M;
    for ( int i = 1; i <= N; ++i )
    {
        is >> x;
        val = x;
        P1 = i;
        Update(1,1,N);
    }
    for ( int i = 1; i <= M; ++i )
    {
        T = 1;
        is >> z >> x >> y;
        if ( z == 0 )
        {
            P1 = x;
            val = y;
            Update(1,1,N);
        }
        else
        {
            Sum = 0;
            P1 = x; P2 = y;
            Query(1,1,N);
            os << Sum << '\n';
        }
    }

    is.close();
    os.close();
}

void Update(int node, int left, int right)
{
    if ( left == right )
    {
        if ( T == 0 )
            Arb[node] = val;
        else
            Arb[node] -= val;
        return;
    }
    int mid = (left+right)/2;

    if ( P1 <= mid )
        Update(2*node,left,mid);
    else
        Update(2*node+1,mid+1,right);
    Arb[node] = Arb[2*node] + Arb[2*node+1];
}

void Query(int node, int left, int right)
{
    if ( left >= P1 && right <= P2 )
    {
        Sum += Arb[node];
        return;
    }
    int mid = (left+right)/2;
    if ( P1 <= mid )
        Query(2*node,left,mid);
    if ( P2 > mid )
        Query(2*node+1,mid+1,right);
}