Cod sursa(job #1970514)

Utilizator miruna999Morarasu Miruna miruna999 Data 19 aprilie 2017 13:42:32
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define pas(x) ((x-1)^x)&x
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,aib[200005],v,a,b,k;

void update(int x,int val)
{
    for(int i=x;i<=n;i+=pas(i))
        aib[i]+=val;
}

int suma(int x)
{
    int sum=0;
    for(int i=x;i>0;i-=pas(i))
        sum+=aib[i];
    return sum;
}

int cautare_binara()
{
    int dr=n,st=1,mijl=0,Sm=0,mini=INT_MAX;
    while(st<=dr)
    {
        mijl=(st+dr)/2;
        Sm=suma(mijl);
        if(Sm==k && mijl<mini)
            mini=mijl;
        else
        if(Sm>=k)
            dr=mijl-1;
        else
            st=mijl+1;
    }
    if(mini!=INT_MAX)
        return mini;
    else
        return -1;
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i)
        f>>a,update(i,a);
    for(int i=1;i<=m;i++)
    {
        f>>v;
        if(v==0)
            f>>a>>b,update(a,b);
        else
        if(v==1)
            f>>a>>b,g<<suma(b)-suma(a-1)<<'\n';
        else
            f>>k,g<<cautare_binara()<<'\n';
    }
    return 0;
}