Cod sursa(job #3221544)

Utilizator Alex_Mihai10Mihai Alex-Ioan Alex_Mihai10 Data 7 aprilie 2024 13:17:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
#define MAX 100005

using namespace std;

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

int aib[MAX];
int n,m;

int ub(int x)
{
    return (x & (-x));
}

void add(int x,int val)
{
    int i;
    for(i=x;i<=n;i+=ub(i))
        aib[i]+=val;
}

int sum(int x)
{
    int rez=0;
    int i;
    for(i=x;i;i-=ub(i))
        rez+=aib[i];
    return rez;
}

int main()
{
    fin>>n>>m;
    int i;
    for(i=1;i<=n;++i)
    {
        int nr;
        fin>>nr;
        add(i,nr);
    }
    while(m--)
    {
        int tip;
        fin>>tip;
        if(tip==0)
        {
            int a,b;
            fin>>a>>b;
            add(a,b);
        }
        else
            if(tip==1)
            {
                int a,b;
                fin>>a>>b;
                fout<<sum(b)-sum(a-1)<<'\n';
            }
            else
            {
                int a;
                fin>>a;
                int rasp=0;
                int b;
                int s=0;
                for(b=17;b>=0;--b)
                    if(rasp+(1<<b)<=n && s+aib[rasp+(1<<b)]<a)
                    {
                        rasp+=(1<<b);
                        s+=aib[rasp];
                    }
                if(sum(rasp+1)==a)
                    fout<<rasp+1<<'\n';
                else
                    fout<<"-1\n";
            }
    }
    return 0;
}