Cod sursa(job #2868394)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 10 martie 2022 21:45:36
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb

#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout("aib.out");
int n,aib[100002],v[100002],pw=1,logn,put[100];

void update (int poz, int val)
{
    for (int i=poz;i<=n;i += (i&-i))
        aib[i] += val;
}

int query (int poz)
{
    int sum=0;
   for (int i=poz;i>=1;i -= (i&-i))
        sum += aib[i];
   return sum;
}

int q3 (int val)
{
    int sum=0,pos=0;
    for (int i=logn;i>=0;i--)
    {
        if (pos+put[i] <=n && sum+aib[pos+put[i]] < val)
        {
            sum+=aib[pos+put[i]];
            pos+=put[i];
        }
    }
    if (sum!= val)
        return -1;
    return pos+1;
}

int main()
{
    int q,i,x,t,a,b;
    fin>>n>>q;
    for (i=1;i<=n;i++)
    {
        fin>>x;
        v[i]=x;
        update (i,x);
    }
    while (pw<=n)
    {
        put[logn]=pw;
        pw*=2;
        logn++;
    }
    logn--;
    pw/=2;
    for (;q>0;q--)
    {
        fin>>t>>a;
        if (t==2)
            fout<<q3(a)<<'\n';
        else{
            fin>>b;
        if (t==0)
            update(a,b),v[a]+=b;
        else
            fout<<query(b)-query(a-1)<<'\n';
        }
    }
    return 0;
}