Cod sursa(job #2870450)

Utilizator Stefan_DomuncoStefan Domunco Stefan_Domunco Data 12 martie 2022 12:49:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define FOR(i, st, dr) for(i = st; i <= dr; i++)
#define pii pair<int,int>
//#define fin cin
//#define fout cout

using namespace std;

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

const int NMAX = 1e5 + 5;
int n, m;
int AIB[NMAX];

inline void update(int poz, int val)
{
    while(poz <= n)
    {
        //AIB[poz] -= w[pz];
        AIB[poz] += val;
        poz += poz & -poz;
    }
}

inline int query(int poz)
{
    int sol = 0;
    while(poz >= 1)
    {
        sol += AIB[poz];
        poz -= poz & -poz;
    }
    return sol;
}

inline int bs(int val)
{
    int st, dr, mij, ax, ssll = NMAX;
    st = 1, dr = n;

    while(st <= dr)
    {
        mij = (st + dr) / 2;
        ax = query(mij);

        if(ax <= val)
        {
            if(ax == val)
                ssll = min(ssll, mij);
            st = mij + 1;
        }
        else dr = mij - 1;
    }

    if(ssll == NMAX)
        return -1;

    return ssll;

}

int main()
{
    int i, val;

    fin >> n >> m;
    for(i = 1; i <= n; ++i)
        fin >> val, update(i, val);

    for(i = 1; i <= m; ++i)
    {
        int a, b, c;
        fin >> a;

        if(a == 0)
        {
            fin >> b >> c;
            update(b, c);
        }
        else if(a == 1)
        {
            fin >> b >> c;
            fout << query(c) - query(b-1) << '\n';
        }
        else
        {
            fin >> b;
            fout << bs(b) << '\n';
        }
    }
    return 0;
}