Cod sursa(job #2877048)

Utilizator k2y201342asdfadfsafsd k2y20 Data 24 martie 2022 08:56:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
using namespace std;

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

const int N=1e5;
int v[N+5],aib[N+5];
int n;
inline int lsb(int x)
{
    return x & (-x);
}

void Update(int pos,int val)
{
    v[pos]+=val;
    for(int i=pos;i<=n;i+=lsb(i))
        aib[i]+=val;
}

int Sum(int pos)
{
    int rez=0;
    for(int i=pos;i>=1;i-=lsb(i))
        rez+=aib[i];
    return rez;
}

int Query(int val)
{
    int st=1,dr=n,poz;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(Sum(mij) <= val) st=mij+1,poz=mij;
        else dr=mij-1;
    }
    if(Sum(poz) == val) return poz;
    return -1;
}
int main()
{
    int m; in>>n>>m;

    for(int i=1;i<=n;i++)
    {
        in>>v[i];
        Update(i,v[i]);
    }

    for(int i=1;i<=m;i++)
    {
        int q;in>>q;
        switch (q)
        {
        case 0:
            {
                int a,b; in>>a>>b;
                Update(a,b);
                break;
            }
        case 1:
            {
                int a,b;in>>a>>b;
                out<<Sum(b)-Sum(a-1)<<'\n';
                break;
            }
        case 2:
            {
                int x;in>>x;
                out<<Query(x)<<'\n';
                break;
            }
        }
    }
    return 0;
}