Cod sursa(job #2833871)

Utilizator NeuerRaducu Ioan Stefan Neuer Data 15 ianuarie 2022 20:30:51
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
///#include <iostream>
#include <fstream>

using namespace std;
const int SIZE = 1e5+10;

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

int v[SIZE], n, m, aux;
int cer, a, b;

int getp2(int n)
{
    return n & (n ^ (n-1));
}

void update(int ind, int val)
{
    int p2 = 1;
    while(p2<=n)
    {
        p2 = getp2(ind);
        v[ind] += val, ind += p2;
    }
}

int qry(int ind)
{
    int p2 = 1, sum = 0;
    while(ind)
    {
        p2 = getp2(ind);
        sum += v[ind], ind -= p2;
    }
    return sum;
}

int bins(int sum)
{
    int st=1, dr=n, mid, rez;
    while(st<=dr)
    {
        mid = (st+dr)>>1;
        rez = qry(mid);
        if(rez==sum) return mid;
        if(rez>sum) dr = mid-1;
        else st = mid+1;
    }
    return -1;
}

int main()
{
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        cin>>aux, update(i, aux);
    while(m--)
    {
        cin>>cer>>a;
        if(cer<2) cin>>b;
        if(!cer) update(a, b);
        else if(cer<2) cout<<qry(b)-qry(a-1)<<'\n';
        else cout<<bins(a)<<'\n';
    }
    return 0;
}