Cod sursa(job #2904129)

Utilizator RaduIonescuRadu Ionescu RaduIonescu Data 17 mai 2022 22:29:41
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in ("rmq.in");
ofstream out ("rmq.out");

int arb_rmq[400004], n, m, a, b, x;
bool op_code;

int interogare(int n, int st, int dr, int x, int y)
{
    if(st>x || dr<y){
        return 0;
    }

    if (st>=x && dr<=y) return arb_rmq[n];

    int mij = (st+dr)>>1;

    return interogare(n*2, st, mij, x, y) + interogare(n*2+1, mij+1, dr, x, y);
}

void modificare(int n, int st, int dr, int p, int val)
{
    if(st>p || dr<p){
        return;
    }

    if (st == dr)
    {
        arb_rmq[n] += val;
        return;
    }

    int mij =(st+dr)>>1;

    if (p <= mij)   modificare(n*2, st, mij, p, val);

    else modificare(n*2+1, mij+1, dr, p, val);

    arb_rmq[n] = arb_rmq[n*2] + arb_rmq[n*2+1];
}

int main()
{
    in>>n>>m;

    for(int i=1 ; i<=n; i++)
    {
        in>>x;
        modificare(1,1,n,i,x);
    }

    for(int i=1; i<=m; i++)
    {
        in>>op_code>>a>>b;

        if(op_code == 1)   out<<interogare(1,1,n,a,b)<<"\n";

        else    modificare(1,1,n,a,-b);
    }

    return 0;
}