Cod sursa(job #2222555)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 17 iulie 2018 11:56:59
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMAX = 1e5+5;
int fn[NMAX],n;
void add(int val, int k)
{
    while (k<=n)
    {
        fn[k]+=val;
        k+=k&-k;
    }
}
int sum(int k)
{
    int s = 0;
    while (k>0)
    {
        s+=fn[k];
        k-=k&-k;
    }
    return s;
}
int query(int val)
{
    int step;
    for (step = 1; step<n; step <<=1);
    for (int i = 0; step>0; step>>=1)
    {
        if (i+step<=n)
        {
            if (fn[i+step]<=val)
            {
                i+=step;
                val-=fn[i];
            }
            if (!val && i)
                return i;
        }
    }
    return -1;
}
int main()
{
    int m;
    in >> n >> m;
    for (int i = 1; i<=n; i++)
    {
        int x;
        in >> x;
        add(x,i);
    }
    for (int i = 1; i<=m; i++)
    {
        int t;
        in >> t;
        if (t == 0)
        {
            int k,val;
            in >> k >> val;
            add(val,k);
        }
        else if (t == 1)
        {
            int st,dr;
            in >> st >> dr;
            out << sum(dr)-sum(st-1) << "\n";
        }
        else
        {
            int val;
            in >> val;
            out << query(val) << "\n";
        }
    }
}