Cod sursa(job #2492861)

Utilizator SochuDarabaneanu Liviu Eugen Sochu Data 15 noiembrie 2019 14:13:16
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>
#define NMAX 15005

using namespace std;

ifstream f ("datorii.in");
ofstream g ("datorii.out");

int n , t , v , x;
int m;
bool operation;

int ab[NMAX * 2 + 5];

void Update(int nod , int st , int dr , int pos , int val)
{
    if(st == dr)
    {
        if(ab[nod] - val < 0)
            ab[nod] = val;
        else ab[nod] -= val;

        return;
    }

    int mij = (dr - st) / 2 + st;

    if(mij >= pos)
        Update(2 * nod , st , mij , pos , val);
    else Update(2 * nod + 1 , mij + 1 , dr , pos , val);

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

void Query(int nod , int st , int dr , int start , int finish , int &sum)
{
    if(start <= st && dr <= finish)
    {
        sum += ab[nod];
        return;
    }

    int mij = (dr - st) / 2 + st;

    if(finish > mij)
        Query(2 * nod + 1 , mij + 1 , dr , start , finish , sum);

    if(start <= mij)
        Query(2 * nod , st , mij , start , finish , sum);
}

int main()
{
    int i , ans = 0;

    f >> n >> m;

    for(i = 1 ; i <= n ; i++)
    {
        f >> x;
        Update(1 , 1 , n , i , x);
    }

    for(i = 1 ; i <= m ; i++)
    {
        f >> operation >> t >> v;

        if(operation == 0)
            Update(1 , 1 , n , t , v);
        else
        {
            ans = 0;
            Query(1 , 1 , n , t , v , ans);
            g << ans << '\n';
        }
    }

    return 0;
}