Cod sursa(job #1606363)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 20 februarie 2016 10:34:15
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,M,aib[100005];

inline void Update(int p, int x)
{
    while(p <= n)
    {
        aib[p]+=x;
        p +=(p&(-p));
    }
}
inline int Query(int p)
{
    int suma = 0;
    while(p > 0)
    {
        suma+=aib[p];
        p -= (p&(-p));
    }
    return suma;
}

inline int Search(int x)
{
    int mid,sol,st,dr,v;
    sol = -1;
    st = 1, dr = n;
    while(st <= dr)
    {
        mid = (st+dr)/2;
        v = Query(mid);
        if(v == x)
        {
            sol = mid;
            dr = mid-1;
        }
        else if(v  > x) dr = mid-1;
        else st = mid+1;
    }
    return sol;
}

void Solve()
{
    int i,op,p,x,t,a,b;
    fin>>n>>M;
    for(i=1;i<=n;++i)
    {
        fin>>x;
        Update(i,x);
    }
    while(M--)
    {
        fin>>op;
        if(op==0)
        {
            fin>>p>>x;
            Update(p,x);
        }
        else if(op==1)
        {
            fin>>a>>b;
            fout<<Query(b)-Query(a-1)<<"\n";
        }
        else
        {
            fin>>x;
            fout<<Search(x)<<"\n";
        }
    }
}
int main()
{
    Solve();
    fout.close();
    return 0;
}