Cod sursa(job #2874874)

Utilizator Ioana_Maria_DicuDicu Ioana Maria Ioana_Maria_Dicu Data 20 martie 2022 13:49:20
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");

#define MAX 100001
int N;

struct aib{
    int v[MAX];
    aib(){
        for(int i = 1; i <= N; i++) v[i] = 0;
    }
    void update(int p, int x){
        for(int i = p; i <= N; i += (i & (-i))){
            v[i] += x;
        }
    }
    int sum(int p){
        int ans = 0;
        for(int i = p; i > 0; i -= (i&(-i))){
            ans += v[i];
        }
        return ans;
    }
};

int main(){
    aib x;
    int M;
    in >> N >> M;
    
    for(int i = 1; i <= N; i++)
    {
        int val;
        in >> val;
        x.update(i, val);
    }
    
    for(int i = 1; i <= M; i++)
    {
        int a, b, c;
        in >> c;
        
        if(c == 0)
        {
            in >> a >> b;
            x.update(a, b);
        }
        if(c == 1)
        {
            in >> a >> b;
            out << x.sum(b) - x.sum(a-1) << endl;
        }
        if(c == 2)
        {
            int st, dr, ans = 0;
            in >> a;
            st = 1;
            dr = N;
            while(st <= dr){
                int m = (st + dr) / 2;
                if(x.sum(m) <= a){
                    st = m + 1;
                    ans = m;
                }
                    
                else
                    dr = m - 1;
            }
            if(x.sum(ans) == a)
                out << ans << endl;
            else
                out << "-1" << endl;
        }
    }
    return 0;
}