Cod sursa(job #2633318)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 7 iulie 2020 10:38:27
Problema Arbori indexati binar Scor 100
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,v[100002],pw=1;

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

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

int q3 (int s)
{
    bool ok=0;
    int poz=0,pas=pw;
    while (pas!=0)
    {
        if (v[pas+poz]==s)
            ok=1;
        if (v[pas+poz]<s)
        {
            s-=v[pas+poz];
            poz+=pas;
        }
        pas/=2;
        while(pas>=1&&pas+poz>n)
           pas/=2;
    }
    if (ok)
        return poz+1;
    else
        return -1;
}

int main()
{
    int q,i,x,t,a,b;
    fin>>n>>q;
    for (i=1;i<=n;i++)
    {
        fin>>x;
        update (i,x);
    }
   // int pw=1,exp=0;
    while (pw<=n)
    {
        pw*=2;
    }
    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);
        else
            fout<<query(b)-query(a-1)<<'\n';
        }
    }
    return 0;
}