Cod sursa(job #3309576)

Utilizator parrot279Sofi Tudose parrot279 Data 6 septembrie 2025 15:06:25
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

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

void update(int poz, int val);
int detsuma(int st, int dr);
int detpozmin(int val);

int n, m;
int aib[100001], v[100001];

int main()
{
    fin>>n>>m;
    for(int i = 1; i <= n; ++i)
    {
        fin>>v[i];
        update(i, v[i]);
    }

    for(int i = 1; i <= m; ++i)
    {
        int tip, a, b;
        fin>>tip;
        if(tip == 0)
        {
            fin>>a>>b;
            update(a, -b);
        }
        else if (tip == 1)
        {
            fin>>a>>b;
            fout<<detsuma(a, b)<<"\n";
        }
    }

    return 0;
}

int detpozmin(int val)
{
    int scrt = 0, pozcrt = 0, p = (1<<18);
    while(p > 0)
    {
        if(pozcrt + p <= n && scrt + aib[pozcrt + p] < val)
        {
            scrt += aib[pozcrt + p];
            pozcrt += p;
        }
        else if (pozcrt + p <= n && scrt + aib[pozcrt + p] == val)
        {
            return pozcrt + p;
        }
        p /= 2;
    }
    return -1;
}

int detsuma(int st, int dr)
{
    if(st != 1)
        return detsuma(1, dr) - detsuma(1, st - 1);

    int s = 0;
    while(dr > 0)
    {
        s += aib[dr];
        dr -= (dr & (-dr));
    }
    return s;
}

void update(int poz, int val)
{
    while(poz <= n)
    {
        aib[poz] += val;
        poz += (poz & (-poz));
    }

}