Cod sursa(job #3161163)

Utilizator matei8787Matei Dobrea matei8787 Data 25 octombrie 2023 22:30:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[100005];
int n, q;
int lsb(int x)
{
    return (~x + 1) & x;
}
void q1(int a, int b)
{
    int j = a;
    while ( j <= n )
    {
        aib[j] += b;
        j += lsb(j);
    }
}
int suma(int a)
{
    int j = a;
    int ans = 0;
    while ( j > 0 )
    {
        ans += aib[j];
        j -= lsb(j);
    }
    return ans;
}
int q2(int a, int b)
{
    return suma(b) - suma(a-1);
}
int q3(int x)
{
    int st = 1;
    int dr = n;
    int ans = -1;
    while ( st <= dr )
    {
        int mij = ( st + dr ) / 2;
        int aux = suma(mij);
        if ( aux == x )
            return mij;
        if ( aux > x )
            dr = mij - 1;
        else
            st = mij + 1;
    }
    return -1;
}
void citire()
{
    in>>n>>q;
    for ( int i = 1 ; i <= n ; i++ )
    {
        int x;
        in>>x;
        q1(i, x);
    }
}
void rez()
{
    for ( int i = 1 ; i <= q ; i++ )
    {
        int op;
        in>>op;
        if ( op == 0 )
        {
            int a, b;
            in>>a>>b;
            q1(a, b);
        }
        else if ( op == 1 )
        {
            int a, b;
            in>>a>>b;
            out<<q2(a, b)<<'\n';
        }
        else
        {
            int a;
            in>>a;
            out<<q3(a)<<'\n';
        }
    }
}
int main()
{
    citire();
    rez();
    return 0;
}