Cod sursa(job #2904250)

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

using namespace std;

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

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

inline int interogare(int n,int st, int dr, int p, int q)
{
    if(p<=st && dr<=q)  return arb_rmq[n];

    int st_aux = 0, dr_aux = 0;

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

    if (p <= mij) st_aux = interogare(n<<1, st, mij, p, q);

    if (q > mij)    dr_aux = interogare(-(~(n << 1)), mij+1, dr, p, q);

    return st_aux + dr_aux;
}

inline void modificare(int n,int st, int dr, int t, int v)
{
    if(st==dr)
    {
        arb_rmq[n] += v;
        return;
    }

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

    if(t<=mij)  modificare(n<<1, st, mij, t, v);

    else    modificare(-(~(n << 1)), mij+1, dr, t, v);

    arb_rmq[n]= arb_rmq[n<<1]+arb_rmq[-(~(n << 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;
}