Cod sursa(job #3258781)

Utilizator nicushor21Pirlog Marian Nicolae nicushor21 Data 23 noiembrie 2024 16:20:14
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
long long n,m,x,y,st,dr,mid,i,j,k,c,aib[100001];
bool ok;
void update(int p, int val){
    for(;p<=n;p+=(p&-p))
        aib[p] += val;
}
long long query(int p){
    long long sum=0;
    for(;p>0;p-=(p&-p))
        sum += aib[p];
    return sum;
}
int main()
{
    ios::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>x,update(i,x);
    while(m--){
        fin>>c;
        if(c == 0){
            fin>>x>>y;
            update(x, y);
        }else if(c == 1){
            fin>>x>>y;
            fout<<query(y)-query(x-1)<<'\n';
        }else{
            fin>>x;
            ok=0;
            st=1; dr=n;
            while(st<=dr){
                mid = (st+dr)/2;
                y = query(mid);
                if(y == x){
                    ok=1;
                    fout<<mid<<'\n';
                    break;
                }
                if(y<x)
                    st = mid+1;
                else
                    dr = mid-1;
            }
            if(!ok)
                fout<<"-1\n";
        }
    }
    return 0;
}