Cod sursa(job #2020670)

Utilizator sergiudnyTritean Sergiu sergiudny Data 11 septembrie 2017 14:18:27
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define zeros(x) (x&(-x))
#define DM 100005

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

int n,m,AIB[DM],a,b,aux;

int getIntv(int dr){
    int ans=0;
    for(int i=dr;i>0;i-=zeros(i))
        ans+=AIB[i];
    return ans;
}

void update(int ind,int val){
    for(int i=ind;i<=n;i+=zeros(i))
        AIB[i]+=val;
}

int cautBin(int sum){
    int st=0,dr=n+1,mid;
    while(dr-st>1){
        mid=(st+dr)/2;
        if(getIntv(mid)<=sum) st=mid;
        else dr=mid;
    }
    if(st==n+1 || !st || getIntv(st)!=sum)
        return -1;
    return st;
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i){
        fin>>aux;
        update(i,aux);
    }
    while(m--){
        fin>>aux;
        if(!aux){
            fin>>a>>b;
            update(a,b);
        }
        else if(aux==1){
            fin>>a>>b;
            fout<<getIntv(b)-getIntv(a-1)<<'\n';
        }
        else{
            fin>>a;
            fout<<cautBin(a)<<'\n';
        }
    }
    return 0;
}