Cod sursa(job #3248315)

Utilizator motocelMotocescu Laura motocel Data 11 octombrie 2024 15:23:53
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n;
int bit[100005];
int a[100005];
void update(int i, int val)
{
    while(i <= n){
        bit[i] += val;
        i += (i & -i);
    }
}
int query(int i)
{
    int sum = 0;
    while(i > 0){
        sum += bit[i];
        i -= (i & -i);
    }
    return sum;
}
int main()
{
    int m;
    fin >> n >> m;
    int cerinta;
    for(int i = 1; i <= n; i ++){
        fin >> a[i];
        update(i, a[i]);
    }
    int x, y;
    for(int i = 1; i <= m; i ++){
        fin >> cerinta;
        if(cerinta == 0){
            fin >> x >> y;
            update(x, y);
            //a[x] += y;
        }
        else if(cerinta == 1){
            fin >> x >> y;
            fout << query(y) - query(x - 1) << "\n";
        }
        else if(cerinta == 2){
            fin >> x;
            int st, dr;
            st = 1;
            dr = n;
            int ok = 0;
            while(dr > st){
                int mid = (dr + st) / 2;
                int rasp = query(mid);
                if(rasp >= x){
                    dr = mid;
                }
                else{
                    st = mid + 1;
                }
            }
            if(query(dr) == x){
                fout << dr << "\n";
            }
            else{
                fout << -1<<'\n';
            }
        }
    }
    return 0;
}