Cod sursa(job #2978029)

Utilizator Elvis_CostinTuca Elvis-Costin Elvis_Costin Data 12 februarie 2023 20:04:50
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.81 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string np = "aib";
ifstream f(np + ".in");
ofstream g(np + ".out");

// #define f cin
// #define g cout

int n, m;

struct segtree
{
    int size = 1;
    vector<int> val;

    void init(int n)
    {
        while (size < n)
            size *= 2;
        val.resize(size * 2);
    }

    void build(vector<int> &aux, int nod, int stnod, int drnod)
    {
        if (drnod - stnod == 1)
        {
            if (stnod < (int)aux.size())
                val[nod] = aux[stnod];
            return;
        }
        int mid = (stnod + drnod) / 2;
        build(aux, nod * 2 + 1, stnod, mid);
        build(aux, nod * 2 + 2, mid, drnod);
        val[nod] = val[nod * 2 + 1] + val[nod * 2 + 2];
    }
    void build(vector<int> &aux)
    {
        build(aux, 0, 0, size);
    }

    void set(int poz, int valoare, int nod, int stnod, int drnod)
    {
        if (drnod - stnod == 1)
        {
            val[nod] += valoare;
            return;
        }
        int mid = (stnod + drnod) / 2;
        if (poz < mid)
            set(poz, valoare, nod * 2 + 1, stnod, mid);
        else
            set(poz, valoare, nod * 2 + 2, mid, drnod);
        val[nod] = val[nod * 2 + 1] + val[nod * 2 + 2];
    }
    void set(int poz, int val)
    {
        set(poz, val, 0, 0, size);
    }

    ll suma(int st, int dr, int nod, int stnod, int drnod)
    {
        if (stnod >= dr or drnod <= st)
            return 0;
        if (stnod >= st and drnod <= dr)
            return val[nod];
        int mid = (stnod + drnod) / 2;
        int s1 = suma(st, dr, nod * 2 + 1, stnod, mid);
        int s2 = suma(st, dr, nod * 2 + 2, mid, drnod);
        return s1 + s2;
    }
    ll suma(int st, int dr)
    {
        return suma(st, dr, 0, 0, size);
    }

    ll minimk(int a)
    {
        int st = 1, dr = n, mid;
        while (st <= dr)
        {
            int mid = (st + dr) / 2;
            int sum = suma(0, mid);
            if (sum == a)
                return mid;
            if (sum < a)
                st = mid + 1;
            else
                dr = mid - 1;
        }
        return -1;
    }
} mst;
int main()
{
    f >> n >> m;
    mst.init(n);

    vector<int> aux(n);
    for (int i = 0; i < n; i++)
        f >> aux[i];
    mst.build(aux);

    for (int cer; f >> cer;)
        if (cer == 0)
        {
            int poz, val;
            f >> poz >> val;
            mst.set(poz - 1, val);
        }
        else if (cer == 1)
        {
            int st, dr;
            f >> st >> dr;
            g << mst.suma(st - 1, dr) << '\n';
        }
        else
        {
            int a;
            f >> a;
            g << mst.minimk(a) << '\n';
        }

    return 0;
}