Cod sursa(job #3243849)

Utilizator maryyMaria Ciutea maryy Data 21 septembrie 2024 19:34:44
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX=1e6;
int v[NMAX+1], n, m;
int max_p2;
void fenwick_build()
{
    max_p2 = n;
    while (max_p2 & (max_p2 - 1))
    {
        max_p2 &= max_p2 - 1;
    }
    for (int i = 1; i <= n; i++)
    {
        int j = i + (i & -i);
        if (j <= n)
        {
            v[j] += v[i];
        }
    }
}

void fenwick_add(int pos, int val)
{
    while(pos<=n)
    {
        v[pos] += val;
        pos += pos & -pos;
    }
}

int fenwick_sum(int pos)
{
    int s = 0;
    while (pos)
    {
        s += v[pos];
        pos &= pos - 1;
    }
    return s;
}

int fenwick_range_sum(int from, int to)
{
    return fenwick_sum(to) - fenwick_sum(from - 1);
}

int fenwick_bin_search(int sum)
{
    int pos = 0;
    for (int interval = max_p2; interval; interval >>= 1)
    {
        if ((pos + interval <= n) && (v[pos + interval] < sum))
        {
          sum -= v[pos + interval];
          pos += interval;
        }
    }

  return pos + 1;
}

int main()
{
    in>>n>>m;
    for(int i=1; i<=n; i++)
        in>>v[i];
    fenwick_build();
    int op, x, y;
    for(int i=1; i<=m; i++)
    {
        in>>op;
        if(op==0)
        {
            in>>x>>y;
            fenwick_add(x, y);
        }
        if(op==1)
        {
            in>>x>>y;
            out<<fenwick_range_sum(x, y)<<'\n';
        }
        if(op==2)
        {
            in>>x;
            out<<fenwick_bin_search(x)<<'\n';
        }
    }
}