Cod sursa(job #2832347)

Utilizator Bogdan.paun50Mandresi Bogdan Bogdan.paun50 Data 13 ianuarie 2022 14:56:21
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

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

int i, n, m, x, q, a, b;
int aib[100010];

int lsb(int i)
{
    return (i&(-i));
}

void update(int i, int p)
{
    for(i; i <= n; i+=lsb(i))
        aib[i] += p;
}

int query1(int i)
{
    int r = 0;
    for(i; i; i-=lsb(i))
        r += aib[i];
    return r;
}

int query2(int p)
{
    int mij;
    int st = 1, dr = n;
    while(st <= dr)
    {
        mij = (st+dr)/2;
        if(query1(mij)>=p)
            dr = mij - 1;
        else st = mij + 1;
    }
    if(p == query1(st))
        return st;
    return -1;

}

int main()
{
    fin >> n >> m;
    for(i = 1; i <= n; i++)
    {
        fin >> x; update(i,x);
    }
    for(int i = 1; i <= m; i++)
    {
        fin >> q;
        if(q == 0)
        {
            fin >> a >> b;
            update(a,b);
        }
        else
            if(q == 1)
            {
                fin >> a >> b;
                fout << query1(b) - query1(a-1) << '\n';
            }
        else
        {
            fin >> a;
            fout << query2(a) << '\n';
        }
    }
    return 0;
}