Cod sursa(job #2972529)

Utilizator Gica-gicutaGeorge Gica-gicuta Data 29 ianuarie 2023 17:32:23
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const long long cst=1e5+5;
long long n,m,v[cst],aib[cst];
void update(long long poz,long long val)
{
    for(long long i=poz; i<=n; i+=(i&-i))
        aib[i]+=val;
}
long long query(long long poz)
{
    long long sum=0;
    for(long long i=poz; i>=1; i-=(i&-i))
    {
        sum+=aib[i];
    }
    return sum;
}
int main()
{
    fin>>n>>m;
    for(long long i=1; i<=n; i++)
    {
        fin>>v[i];
        update(i,v[i]);
    }
    for(long long i=1; i<=m; i++)
    {
        long long cer;
        fin>>cer;
        if(cer==0)
        {
            long long a,b;
            fin>>a>>b;
            update(a,b);
        }
        else if(cer==1)
        {
            long long a,b;
            fin>>a>>b;
            fout<<query(b)-query(a-1)<<'\n';
        }
        else
        {
            long long a;
            fin>>a;
            long long i1=1,i2=n,mij,rez=-1;
            while(i1<=i2)
            {
                mij=(i1+i2)/2;
                long long sum=query(mij);
                if(sum<a)
                    i1=mij+1;
                else if(sum>a)
                    i2=mij-1;
                else
                {
                    i2=mij-1;
                    if(rez==-1)
                        rez=mij;
                    else rez=min(rez,mij);
                }
            }
            fout<<rez<<'\n';
        }
    }
    return 0;
}