Cod sursa(job #2482890)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 28 octombrie 2019 23:34:31
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define NMAX 200005
#define ZERO(x) ((x^(x-1))&x)
using namespace std;
typedef long long ll;
int aib[100005], n, q, i, j, x, y, tip;
    FILE *fin=fopen("aib.in","r");
    FILE *fout=fopen("aib.out","w");
void upd(ll p, ll x)
{
    for(int i=p;i<=n;i+=ZERO(i))
        aib[i]+=x;
}
ll query(ll p)
{
    ll ans=0;
    while(p)
    {
        ans+=aib[p];
        p-=ZERO(p);
    }
    return ans;
}
ll ok(ll m, ll key)
{
    return query(m)<=key;
}
ll cautbin(ll l, ll key, ll r)
{
    while(l!=r)
    {
        ll m=(l+r+1)/2;
        if(ok(m,key))
            l=m;
        else r=m-1;
    }
    return l;
}
int main()
{
  //  fast();
    fscanf(fin,"%d%d",&n,&q);
    for(i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&x);
        upd(i,x);
    }
    //for(i=1;i<=n;i++)
      //  cout<<aib[i]<<' ';
    while(q)
    {
        q--;
        fscanf(fin,"%d",&tip);
        if(tip==0)
        {
            fscanf(fin,"%d%d",&i,&x);
            upd(i,x);
        }
        else if(tip==1)
        {
            fscanf(fin,"%d%d",&x,&y);
            fprintf(fout,"%d\n",query(y)-query(x-1));
        }
        else
        {
            fscanf(fin,"%d",&x);
            if(query(cautbin(1,x,n))==x)
                fprintf(fout,"%d\n",cautbin(1,x,n));
            else fprintf(fout,"-1\n");
        }
    }
    return 0;
}