Cod sursa(job #2144961)

Utilizator tanasaradutanasaradu tanasaradu Data 27 februarie 2018 00:15:51
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
const int Nmax =  100005;
int aib[Nmax] , n;
 /// aib[i] - suma elementelor din intervalul [i - 2 ^ p + 1 , i]
 /// p - nr de biti de 0 in care se termina numarul i
inline void UPDATE(int poz , int x)
{
    while(poz <= n)
    {
        aib[poz] += x;
        poz += (poz & ( - poz));
    }
}
inline int Sum(int poz)
{
    int s = 0;
    while(poz >= 1)
    {
        s += aib[poz];
        poz -= (poz & ( - poz));
    }
    return s;
}
inline void Binary_Search(int x)
{
    int stg = 1 , drp = n , poz = - 1 , mij , s;
    while(stg <= drp)
    {
        mij = (stg + drp) / 2;
        s = Sum(mij);
        if(s == x)
        {
            poz = mij;
            drp = mij - 1;
        }
        else if(s < x)
            stg = mij + 1;
        else drp = mij - 1;
    }
    fout << poz << "\n";
}
int main()
{
    int x , Q , op , y;
    fin >> n >> Q;
    for(int i = 1 ; i <= n ; i++)
    {
        fin >> x;
        UPDATE(i , x);
    }
    while(Q -- )
    {
        fin >> op >> x;
        if(op == 0)
        {
            fin >> y;
            UPDATE(x , y);
        }
        else if(op == 1)
        {
            fin >> y;
            fout << Sum(y) - Sum(x - 1) << "\n";
        }
        else
            Binary_Search(x);
    }
    fin.close();
    fout.close();
    return 0;
}