Cod sursa(job #2570323)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 4 martie 2020 16:10:03
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>
#define zeros(x) ((x^(x-1))&x)
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n,m,x,y,op,lg;
int aib[100005];
void add(int p,int x)
{
    for(int i=p;i<=n;i+=zeros(i))
        aib[i]+=x;
}
int query(int p)
{
    int ans=0;
    for(int i=p;i>0;i-=zeros(i))
       ans+=aib[i];
    return ans;
}
int cauta(int x)
{
  if(x==0) return -1;
  int poz=0;
  for(int bit=(1<<lg);bit>=1;bit>>=1)
     if(poz+bit<=n&&aib[poz+bit]<=x)
     {
         x-=aib[poz+bit];
         poz+=bit;
     }
     if(x==0) return poz;
     else return -1;
}
int main()
{
    in>>n>>m;
    for(int i=1;i<=n;i++) {
        in>>x;
        add(i,x);
    }
    lg=log2(n);
    while(m--)
    {
        in>>op>>x;
        if(op==0||op==1) in>>y;
        if(op==0) add(x,y);
        if(op==1) out<<query(y)-query(x-1)<<'\n';
        if(op==2) out<<cauta(x)<<'\n';
    }
    return 0;
}