Cod sursa(job #2961138)

Utilizator RaresPoinaruPoinaru-Rares-Aurel RaresPoinaru Data 5 ianuarie 2023 21:31:39
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");

typedef long long ll;
const int MAXN=150010;


int n,q;
ll aib[MAXN];

void Update (int pos, int val){
    for (int i=pos;i<=n;i+=(i&(-i)))
        aib[i]+=val;
}
long long Suma (int pos){
    long long rez=0;
    for (int i=pos;i>=1;i-=(i&(-i))){
        rez+=aib[i];
    }
    return rez;
}
int Solve (int val){
    int s=0,rez=0;
    for (int i=25;i>=0;--i){
        if (rez+(1<<i)<=n and s+aib[rez+(1<<i)]<val){
            s+=aib[rez+(1<<i)];
            rez+=(1<<i);
        }
    }
    rez++;
    if (rez>n or Suma (rez)!=val)
        return -1;
    return rez;
}

int main()
{
    fin >>n>>q;
    for (int i=1;i<=n;++i){
        int x;
        fin >>x;
        Update (i,x);
    }

    for (int i=1;i<=q;++i){
        int tip;
        fin >>tip;
        if (tip==0){
            int a,b;
            fin >>a>>b;
            Update (a,b);
            /*fout <<'\n';
            for (int j=1;j<=n;++j){
                fout <<aib[j]<<' ';
            }
            fout <<'\n';*/
        }
        else{
            if (tip==1){
                int a,b;
                fin >>a>>b;
                fout <<Suma (b)-Suma (a-1)<<'\n';
            }
            else{
                int x;
                fin >>x;
                fout <<Solve (x)<<'\n';
            }
        }
    }
    fin.close ();
    fout.close ();
    return 0;
}