Cod sursa(job #3143219)

Utilizator proflaurianPanaete Adrian proflaurian Data 28 iulie 2023 10:25:27
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int N = 100010;
int n,q,a[N];
int suma(int p)
{
    int suma=0;
    for(int i=p; i>0; i-=i&(-i))
        suma+=a[i];
    return suma;
}
void aduna(int p,int val)
{
    for(int i=p; i<=n; i+=i&(-i))
        a[i]+=val;
}
int suma(int st,int dr)
{
    return suma(dr)-suma(st-1);
}
int main()
{
    f>>n>>q;
    for(int i=1; i<=n; i++)
    {
        int x;
        f>>x;
        aduna(i,x);
    }
    for(int i=1; i<=q; i++)
    {
        int t;
        f>>t;
        if(t==0)
        {
            int poz,val;
            f>>poz>>val;
            aduna(poz,val);
        }
        else if(t==1)
        {
            int st,dr;
            f>>st>>dr;
            g<<suma(st,dr)<<'\n';
        }
        else
        {
            int sum;
            f>>sum;
            int lo=0,hi=n,mi;
            while(hi-lo>1)
            {
                mi=(lo+hi)/2;
                if(suma(mi)<sum)
                    lo=mi;
                else
                    hi=mi;
            }
            if(suma(hi)==sum)
                g<<hi<<'\n';
            else
                g<<"-1\n";
        }

    }
    return 0;
}