Cod sursa(job #2874881)

Utilizator RazvanDinuRazvan Dinu RazvanDinu Data 20 martie 2022 13:58:12
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
using namespace std;

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

int aib[100005], n;

void update(int p, int x)
{
    for(int i=p; i<=n; i+=(i&(-i)))
        aib[i]+=x;
}

int sum(int p)
{
    int ans=0;
    for(int i=p; i>=1; i-=(i&(-i)))
        ans+=aib[i];
    return ans;
}

int sk(int k)
{
    int st=1, dr=n, ans=1;
    while(st<=dr)
    {
        int m=(st+dr)/2;
        if(sum(m)<=k)
        {
            st=m+1;
            ans=m;
        }
        else
            dr=m-1;
    }
    if(sum(ans)==k)
        return ans;
    return -1;
}

int main()
{
    int m, c, a, b, x, i;
    in>>n>>m;
    for(i=1; i<=n; i++)
    {
        in>>x;
        update(i, x);
    }
    for(i=1; i<=m; i++)
    {
        in>>c;
        if(c==0)
        {
            in>>a>>b;
            update(a, b);
        }
        else if(c==1)
        {
            in>>a>>b;
            out<<sum(b)-sum(a-1)<<'\n';
        }
        else if(c==2)
        {
            in>>a;
            out<<sk(a)<<'\n';
        }
    }
    return 0;
}