Cod sursa(job #2857937)

Utilizator PescaPescariu Matei Alexandru Pesca Data 26 februarie 2022 17:42:39
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int const N=100005;
int n;
struct aib
{
    //int v[N];
    int v[N];
    aib(){
        fill(v , v + N , 0);
    }
    #define z(x) ((x)&(-x))
    void add(int p,int x)
    {
        for(int i=p;i<=n;i+=z(i))
            v[i]+=x;
    }
    int sum(int p)
    {
        int r=0;
        for(int i=p;i>0;i-=z(i))
            r+=v[i];
        return r;
    }
}g;
void caut(int x,int s=1,int d=n)
{
    int m=(s+d)/2,a;
    if(d<s)
    {
        if(g.sum(s)!=x)
            fout<<"-1\n";
        return;
    }
    a=g.sum(m);
    if(a==x)
    {
        fout<<m<<'\n';
        return;
    }
    if(a<x)
        caut(x,m+1,d);
    else
        caut(x,s,m-1);
}
int main()
{
    int q,al;
    fin>>n>>q;
    for(int i=1;i<=n;i++)
        {
            fin>>al;
            g.add(i,al);
        }
    while(q--)
    {
        int a,x,y;
        fin>>a;
        if(a==2)
            fin>>x;
        else
            fin>>x>>y;
        if(a==0)
            g.add(x,y);
        if(a==1)
            fout<<g.sum(y)-g.sum(x-1)<<'\n';
        if(a==2)
            caut(x);
    }
}