Cod sursa(job #1713504)

Utilizator dani_mocanuDani Mocanu dani_mocanu Data 5 iunie 2016 18:55:49
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

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

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

inline int Query(int p)
{
    int sol = 0;
    while(p > 0)
    {
        sol += aib[p];
        p -= p&(-p);
    }
    return sol;
}

inline int Search(int k)
{
    int sol,suma,p;
    sol = suma = 0;
    for(p = 16; p >= 0; --p)
    {
        if(sol + (1 << p) > n) continue;
        if(suma + aib[sol+(1 << p)] >= k) continue;
        sol += (1 << p);
        suma += aib[sol];
    }
    if(Query(sol+1) == k) return sol+1;
    return -1;
}


int main()
{
    int i,x,a,b,tip,k;
    fin>>n>>m;
    for(i = 1; i <= n; i++)
    {
        fin>>x;
        Update(i,x);
    }
    for(i = 1; i <= m; i++)
    {
        fin>>tip;
        if(tip == 2)
        {
            fin>>k;
            fout << Search(k) << "\n";
            continue;
        }
        fin>>a>>b;
        if(tip == 0) Update(a,b);
        else fout << Query(b) - Query(a-1) << "\n";
    }

    fout.close();
    return 0;
}