Cod sursa(job #2539714)

Utilizator severutBogdan Sever-Cristian severut Data 6 februarie 2020 10:42:07
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#define zeros(x) ((x^(x-1))&x)
using namespace std;

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

int n,m;
int v[100005],aib[100005];
void bobby(int poz,int val)
{
    for(int i=poz;i<=n;i+=zeros(i)){
        aib[i]+=val;
    }
}
int query(int st,int dr)
{
    int rez=0,rez1=0;
    for(int i=st-1;i>0;i-=zeros(i))
    {
        rez+=aib[i];
    }
    for(int i=dr;i>0;i-=zeros(i))
    {
        rez1+=aib[i];
    }
    return rez1-rez;
}
int cautbin(int val)
{
    int poz=0;
    for(int i=1<<30;i>0;i=i>>1)
    {
        if(poz+i<=n)
        {
            if(query(1,poz+i)<val)
            {
                poz+=i;
            }
        }
    }
    poz++;
    if(query(1,poz)==val)
        return poz;
    return -1;
}
int main()
{
    int cer,x,y;
    in>>n>>m;
    for(int i=1;i<=n;++i){
        in>>v[i];
        bobby(i,v[i]);
    }
    for(int i=1;i<=m;++i){
        in>>cer;
        if(cer==0){
            in>>x>>y;
            bobby(x,y);
        }
        if(cer==1){
            in>>x>>y;
            out<<query(x,y)<<'\n';
        }
        if(cer==2){
            in>>x;
            out<<cautbin(x)<<'\n';
        }
    }
    return 0;
}