Cod sursa(job #3213889)

Utilizator AlexInfoIordachioaiei Alex AlexInfo Data 13 martie 2024 16:21:47
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

#define pii pair<int, int>
#define pb push_back
#define fi first
#define se second
typedef long long ll;

const int NMAX = 1e5 + 30;
const int INF = 0x3f3f3f3f;

int n, m, v[NMAX], BIT[NMAX], op, a, b, s;
vector<int> ans;

void read()
{
    in >> n >> m;
    for (int i = 1; i <= n; i++)
        in >> v[i];
}

void update(int index, int val)
{
    for (int i = index; i <= n; i += i & -i)
        BIT[i] += val;
}

int getsum(int index)
{
    int sum = 0;
    for (int i = index; i >= 1; i -= i & -i)
        sum += BIT[i];

    return sum;
}

void solve()
{
    for (int i = 1; i <= n; i++)
        update(i, v[i]);

    for (int i = 1; i <= m; i++)
    {
        in >> op;
        if (op == 2)
        {
            in>>s;
            int le=1, ri=n, mid;
            while (le<=ri)
            {
                mid = (le+ri)/2;
                int sum = getsum(mid);
                if (s==sum) 
                {
                    out<<mid<<'\n';
                    break;
                }
                else if (sum<s) le = mid + 1;
                else ri = mid - 1; 
            }
        }
        else 
        {
            in>>a>>b;
            if (op==0) update(a, b);
            else out<<getsum(b) - getsum(a-1)<<'\n';
        }
    }
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);

    read();
    solve();

    return 0;
}