Cod sursa(job #3364839)

Utilizator AnderManStaneci-Barbieru Andrei AnderMan Data 12 septembrie 2026 11:02:08
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m, op;
vector<int> v;
vector<long long> s;

void mt(int i, int p, int q){
    if(p == q){
        s[i] = v[p];
    }else{
        int mij = (p + q) / 2;
        mt(i * 2, p, mij);
        mt(i * 2 + 1, mij + 1, q);
        s[i] = s[i * 2] + s[i * 2 + 1];
    }
}

long long suma(int i, int p, int q, int x, int y){
    if(x > q || y < p){
        return 0;
    }else if(x <= p && q <= y){
        return s[i];
    }else{
        int mij = (p + q) / 2;
        long long a = suma(i * 2, p, mij, x, y);
        long long b = suma(i * 2 + 1, mij + 1, q, x, y);
        return a + b;
    }
}

void update(int i, int p, int q, int x){
    if(p == q && q == x){
        s[i] = v[x];
    }else{
        int mij = (p + q) / 2;
        if(x <= mij){
            update(i * 2, p, mij, x);
        }else{
            update(i * 2 + 1, mij + 1, q, x);
        }
        s[i] = s[i * 2] + s[i * 2 + 1];
    }
}

int main()
{
    int i, left, right, mid;
    bool eok = 0;
    long long x, y, rez;
    
    fin >> n >> m;
    v.resize(n + 1);
    s.resize(4 * n + 4);
    
    for(i = 1; i <= n; ++i){
        fin >> v[i];
    }
    
    mt(1, 1, n);
    
    for(i = 1; i <= m; ++i){
        fin >> op;
        
        if(op == 0){
            
            fin >> x >> y;
            v[x] += y;
            update(1, 1, n, x);
            
        }else if(op == 1){
            
            fin >> x >> y;
            fout << suma(1, 1, n, x, y) << endl;
            
        }else{
            eok = 0;
            fin >> x;
            left = 1, right = n;
            
            while(left <= right){
                mid = (left + right) / 2;
                rez = suma(1, 1, n, 1, mid);
                if(rez < x){
                    left = mid + 1;
                }else if(rez > x){
                    right = mid - 1;
                }else{
                    eok = 1;
                    fout << mid << endl;
                    break;
                }
            }
            
            if(eok == 0) fout << -1 << endl;
        }
    }

    return 0;
}