Cod sursa(job #2870907)

Utilizator elenacurecheriuElena Curecheriu elenacurecheriu Data 12 martie 2022 17:31:57
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#pragma GCC optimize ("Ofast")

using namespace std;

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

int aib[100005];
int n, m, p;

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

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

int google(int val)
{
    int ans = 0, s=0;
    for(int i = p; i>=1; i >>= 1)
        if((ans+i <= n) && (s + aib[ans+i] <= val))
           ans+=i, s+=aib[ans];
    if(s == val && ans != 0)
        return ans;
    else
        return -1;
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        int x;
        fin>>x;
        update(i, x);
    }
    p=1;
    while(p*2 <= n)
        p*=2;
    for(int i=1; i<=m; i++)
    {
        int op, x, y;
        fin>>op;
        if(op==0)
        {
            fin>>x>>y;
            update(x, y);
        }
        if(op==1)
        {
            fin>>x>>y;
            fout<<query(y)-query(x-1)<<'\n';
        }
        if(op==2)
        {
            fin>>x;
            fout<<google(x)<<'\n';
        }
    }
    return 0;
}