Cod sursa(job #1969339)

Utilizator popescu.octavianPopescu Octavian popescu.octavian Data 18 aprilie 2017 13:45:12
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#define zerouri(x) ((x^(x-1))&x)
#define NMax 100005
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int N, M, x, i, a, b, tip, v[NMax];

void Add (int x, int val)
{
    for(int i=x; i<=N; i+=zerouri(i))
        v[i]+=val;
}

int Query (int x)
{
    int ans=0;
    for(int i=x; i>0; i-=zerouri(i))
        ans+=v[i];

    return ans;
}
int Search(int val)
{
    int st=1, dr=N, m=(st+dr)/2;
    int suma=Query(m);
    while(suma!=val && st<=dr)
    {
        if(suma>val) dr=m-1;
            else if(suma<val) st=m+1;
        m=(st+dr)/2;
        suma=Query(m);
    }
    if(st>dr) return -1;
    return m;
}
int main()
{
    f>>N>>M;
    for(i=1; i<=N; i++)
    {
        f>>x;
        Add(i,x);
    }
    for(i=1; i<=M; i++)
    {
        f>>tip;
        if(tip<2)
        {
            f>>a>>b;
            if(tip==0) Add(a,b);
            else g<<Query(b)-Query(a-1)<<'\n';
        }
        else
        {
            f>>a;
            g<<Search(a)<<'\n';
        }
    }
    return 0;
}