Cod sursa(job #3180650)

Utilizator TeodorVTeodorV TeodorV Data 5 decembrie 2023 18:25:59
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

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

const int Nmax=100001;
int aib[Nmax],n;

int getP2min(int x)
{
    return (x&(-x));
}

void addAIB(int pos, int val)
{
    while(pos<=n)
    {
        aib[pos]+=val;
        pos+=getP2min(pos);
    }
}

long long sumAIB(int pos)
{
    long long rez=0;
    while(pos!=0)
    {
        rez+=aib[pos];
        pos-=getP2min(pos);
    }
    return rez;
}

int pos_minAIB(long long s)
{
    int pas=1<<16,pos=0;
    long long cs=s;
    while(pas!=0)
    {
        if(pos+pas<=n && aib[pos+pas]<s)
        {
            s-=aib[pos+pas];
            pos+=pas;
        }
        pas/=2;
    }
    if(pos<n && sumAIB(pos+1)==cs)
    {
        return pos+1;
    }
    return -1;
}

int main()
{
    int m;
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        int val;
        fin>>val;
        addAIB(i, val);
    }
    for(int i=1; i<=m; i++)
    {
        int t;
        fin>>t;
        if(t==0)
        {
            int pos,val;
            fin>>pos>>val;
            addAIB(pos, val);
        }
        else if(t==1)
        {
            int st,dr;
            fin>>st>>dr;
            fout<<sumAIB(dr)-sumAIB(st-1)<<'\n';
        }
        else
        {
            long long s;
            fin>>s;
            fout<<pos_minAIB(s)<<'\n';
        }
    }
    return 0;
}