Cod sursa(job #2446856)

Utilizator uvIanisUrsu Ianis Vlad uvIanis Data 10 august 2019 23:07:22
Problema Arbori indexati binar Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <iostream>
using namespace std;

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

int aib[100001], N, M, A, B, X;

void update(int i, int x){
    while(i <= N){
        aib[i] += x;
        i += (i&-i);
    }
}

int query(int i){
    int s = 0;
    while(i > 0){
        s += aib[i];
        i -= (i&-i);
    }
    return s;
}

int bin(int s){
    int first{1}, last{N},  mid;
    while(last & (last - 1)) last++;

    if(last == N) last *= 2;

    while(first <= last){

        mid = (first + last)/2;
        if(s >= aib[mid]){
            s = s - aib[mid];
            if(s == 0) return mid;

            first = mid + 1;
        }
        else last = mid - 1;

    }


    return -1;
}

int main()
{
    fin>>N>>M;
   for(int i=1; i<=N; i++){
        fin>>X;
        update(i, X);

   }

   for(; M; M--){
     fin>>X>>A;

     if(X == 2){
        fout<<bin(A)<<"\n";
     }
     else {
        fin>>B;
        if(X == 0){
            update(A, B);
        } else {
            fout<<query(B) - query(A - 1)<<"\n";
        }
     }
   }
}