Cod sursa(job #2538934)

Utilizator BaraianTudorBaraian Tudor Stefan BaraianTudor Data 5 februarie 2020 13:02:43
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#define zero(x) ((x^(x-1))&x)
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n,m,v[100005],aib[100005],p,a1,b1;
void add(int x,int cant)
{
    for(int i=x;i<=n;i+=zero(i))
    {
        aib[i]+=cant;
    }
}
int cer1(int st,int dr)
{
    int rez=0,rez1=0;
    for(int i=st-1;i>0;i-=zero(i))
    {
        rez+=aib[i];
    }
    for(int i=dr;i>0;i-=zero(i))
    {
        rez1+=aib[i];
    }
    return rez1-rez;
}
int caut(int val)
{
    int poz=0;
    for(int i=1<<30;i>0;i=i>>1)
    {
        if(poz+i<=n)
        {
            if(cer1(1,poz+i)<val)
            {
                poz+=i;
            }
        }
    }
    poz++;
    if(cer1(1,poz)==val)return poz;
    return -1;
}
int main()
{
    in>>n>>m;
    for(int i=1;i<=n;i++)
    {
        in>>v[i];
        add(i,v[i]);
    }
    for(int i=1;i<=m;i++)
    {
        in>>p;
        if(p==0)
        {
            in>>a1>>b1;
            add(a1,b1);
        }
        if(p==1)
        {
            in>>a1>>b1;
            out<<cer1(a1,b1)<<'\n';
        }
        if(p==2)
        {
            in>>a1;
            out<<caut(a1)<<'\n';
        }
    }
    return 0;
}