Cod sursa(job #2867596)

Utilizator TeofilIacobTeo george TeofilIacob Data 10 martie 2022 14:04:09
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int N=100010;
int n,m,op,aib[N];
void adun(int i,int v)
{
    for(;i<=n;i+=i&(-i))
        aib[i]+=v;
}
int suma(int i)
{
    int sol=0;
    for(;i;i-=i&(-i))
        sol+=aib[i];
    return sol;
}
int suma(int a,int b)
{
    return suma(b)-suma(a-1);
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        f>>x;
        adun(i,x);
    }
    for(int i=1;i<=m;i++)
    {
        f>>op;
        if(op==0)
        {
            int x,y;
            f>>x>>y;
            adun(x,y);
        }
        else
        if(op==1)
        {
            int a,b;
            f>>a>>b;
            g<<suma(a,b)<<'\n';
        }
        else
        {
            int lo=0,hi=n,mi,a;
            f>>a;
            while(hi-lo>1)
            {
                mi=(hi+lo)/2;
                if(suma(mi)<a)
                    lo=mi;
                else
                    hi=mi;
            }
            if(suma(hi)==a)
                g<<hi<<'\n';
            else
                g<<"-1\n";

        }
    }
    return 0;
}
//
//class punct
//{
//    int x,y;
//public:
//    punct()
//    {
//        x=y=0;
//    }
//    punct(int _x,int _y)
//    {
//        x=_x;y=_y;
//    }
//    int getX()
//    {
//        return x;
//    }
//    int getY()
//    {
//        return y;
//    }
//    void setX(int _x)
//    {
//        x=_x;
//    }
//    void setY(int _y)
//    {
//        y=_y;
//    }
//};