Cod sursa(job #2829296)

Utilizator AndreiCroitoruAndrei Croitoru AndreiCroitoru Data 8 ianuarie 2022 14:26:32
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;
int aib[100001];

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

int querry( int nod )
{
    int s = 0;
    for( int i = nod ; i >= 1; i -= (i&(-i)))
    {
        s += aib[i];
    }
    return s;

}

int cbin( int val )
{
   int ans = 0, pas = 1 << 17;
   long long sum = 0;
   while ( pas )
   {
       if (ans + pas <=n and sum + aib[ans + pas] <= val )
       {
           sum += aib[ans + pas];
           ans += pas;
           if ( sum == val )
                return ans;
       }
       pas >>= 1;
   }
   return -1;
}

int main()
{

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

    int t;
    int x;
    cin >> n >> t;
    for ( int i = 1; i <= n; i++)
    {
        cin >> x;
        update ( i, x);
    }
    while ( t--)
    {
        int q, a, b;
        cin >> q >> a;
        if ( q != 2)
            cin >> b;
        if (q == 0)
            update( a, b);
        if ( q == 1 )
        {
            cout << querry(b) - querry(a - 1) << '\n';
        }
        if ( q == 2 )
        {
            cout << cbin(a) << '\n';
        }
    }
}