Cod sursa(job #2513785)

Utilizator stefan.popescuPopescu Stefan stefan.popescu Data 23 decembrie 2019 19:21:32
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
inline int nrz(int x)
{
    return ((x^(x-1))&x);
}
ifstream in ("aib.in");
ofstream out("aib.out");
int n, m;
vector <int> aib;
int caz, x, y;
void add(int x, int y)
{
    for(int i=x; i<=n; i+=nrz(i))
        aib[i]+=y;
}
int suma(int x)
{
    int s=0;
    for(int i=x; i>0; i-=nrz(i))
        s+=aib[i];
    return s;
}
int cauta(int val)
{
    if(val==0) return -1;
    int step;
    for(step=1; step<=n; step<<=1);
    for(int i=0; step; step>>=1)
    {
        if(i+step<=n)
            if(aib[i+step]<=val)
            {
                val-=aib[i+step];
                i+=step;
                if(!val) return i;
            }
    }
    return -1;
}
int main()
{
    in>>n>>m;
    aib.resize(n+2, 0);
    for(int i=1; i<=n; i++)
        in>>x, add(i, x);
    for(int i=1; i<=m; i++)
    {
        in>>caz;
        if(caz==0)
        {
            in>>x>>y;
            add(x, y);
        }
        else if(caz==1)
        {
            in>>x>>y;
            out<<suma(y)-suma(x-1)<<"\n";
        }
        else
        {
            in>>x;
            out<<cauta(x)<<"\n";
        }
    }
    return 0;
}