Cod sursa(job #2514600)

Utilizator Rares31100Popa Rares Rares31100 Data 26 decembrie 2019 15:04:54
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <cmath>

using namespace std;

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

int n,m,baza;
int tree[270001];

void add(int poz,int val)
{
    poz+=baza-1;
    tree[poz]+=val;
    poz/=2;

    while(poz)
    {
        tree[poz]=tree[poz*2]+tree[poz*2+1];
        poz/=2;
    }
}

int suma(int a,int b)
{
    a+=baza-1;
    b+=baza-1;
    int s=0;

    while(a<=b)
    {
        if(a%2==1)
            s+=tree[a],a++;

        if(b%2==0)
            s+=tree[b],b--;

        a/=2;b/=2;
    }

    return s;
}

int pozSuma(int val)
{
    int dr=1;

    for(int pas=n-1;pas;pas/=2)
        while(dr+pas<=n && suma(1,dr+pas)<=val )
            dr+=pas;

    if(suma(1,dr)==val)
        return dr;

    return -1;
}

int main()
{
    cin>>n>>m;

    baza=pow( 2 , (int)log2(n)+( log2(n)>(int)log2(n)?1:0 ) );

    for(int i=baza;i<=baza+n-1;i++)
        cin>>tree[i];

    for(int k=baza/2;k;k/=2)
        for(int i=k;i<=k*2-1;i++)
            tree[i]=tree[i*2]+tree[i*2+1];

    int q,a,b;

    for(int k=1;k<=m;k++)
    {
        cin>>q;

        if(q==0)
        {
            cin>>a>>b;
            add(a,b);
        }
        else if(q==1)
        {
            cin>>a>>b;
            cout<<suma(a,b)<<'\n';
        }
        else
        {
            cin>>a;
            cout<<pozSuma(a)<<'\n';
        }
    }

    return 0;
}