Cod sursa(job #2486015)

Utilizator PatrascuAdrian1Patrascu Adrian Octavian PatrascuAdrian1 Data 2 noiembrie 2019 11:20:41
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;

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

const int Nmax = 1e5 + 5;
int x,y,N,M,p;
int a[Nmax];

inline int bit(int x)
{
    return (x ^ (x - 1)) & x;
}

inline void add(int x,int y)
{
    for(int i = x; i <= N; i += bit(i))
        a[i] += y;
}

int query(int x)
{
    int S = 0;
    for(int i = x; i >= 1; i -= bit(i))
        S += a[i];
    return S;
}

 inline int bin_s(int left, int right, int val)
{
    int m = left + (right - left) / 2;
    int found = query(m);
    if(found == val)
        return m;
    else if(found > val)
        bin_s(left,m - 1,val);
    else bin_s(m + 1,right,val);
}

int main()
{
    ios_base::sync_with_stdio(0);
    in >> N >> M;
    for(int i = 1; i <= N; ++i)
    {
        int X;
        in >> X;
        add(i,X);
    }
    for(; M; --M)
    {
        in >> p >> x;
        if(!p)
        {
            in >> y;
            add(x,y);
        }
        else if(p == 1)
        {
            in >> y;
            out << query(y) - query(x - 1) << '\n';
        }
        else out << bin_s(1,N,x) << '\n';
    }

    return 0;
}