Cod sursa(job #2449711)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 20 august 2019 15:22:51
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX=100002;
#define zeros(x) x&-x
int aib[NMAX],n,m;
void update(int poz,int val){
    for(poz;poz<=n;poz+=zeros(poz))
        aib[poz]+=val;
}
int compute(int poz){
    int sum=0;
    for(poz;poz;poz-=zeros(poz))
        sum+=aib[poz];
    return sum;
}
int Find(int val){
    int bit,poz=0,rez;
    for(bit=1;bit<n;bit<<=1);
    while(bit){
        int cpoz=poz+bit;
        bit>>=1;
      if(cpoz>n)
            continue;
      if(val==aib[cpoz]){
        return cpoz;
      }
      else if(aib[cpoz]<val){
        val-=aib[cpoz];
        poz=cpoz;
      }
    }
    if(val)
        return -1;
    else
        return 0;
}
int main()
{
    in>>n>>m;
    int val,tip,x,y;
    for(int i=1;i<=n;i++){
        in>>val;
        update(i,val);
    }
    for(int i=1;i<=m;i++){
        in>>tip;
        if(tip==0){
            in>>x>>y;
            update(x,y);
        }
        else if(tip==1){
            in>>x>>y;
            out<<compute(y)-compute(x-1)<<'\n';

        }
        else{
            in>>x;
            out<<Find(x)<<'\n';
        }
    }
    return 0;
}