Cod sursa(job #2409408)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 18 aprilie 2019 23:25:30
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define ff first
#define ss second

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;

const string file = "aib";
const ll INF = 9223372036854775807ll;
const int inf = 2147483647, nmax = 100005;

int n, test, aib[nmax];

void update(int pos, int val)
{
    while(pos <= n){
        aib[pos] += val;
        pos += (pos&(-pos));
    }
}

int read(int pos)
{
    int sum = 0;
    while(pos){
        sum += aib[pos];
        pos -= (pos&(-pos));
    }
    return sum;
}

int main()
{
    ifstream fin (file+".in");
    ofstream fout (file+".out");
    fin >> n >> test;
    for (int i = 1; i <= n; ++i){
        int x;
        fin >> x;
        update(i, x);
    }
    while(test--){
        int t;
        fin >> t;
        switch(t){
            case 0:{
                int pos, val;
                fin >> pos >> val;
                update(pos, val);
                break;
            }case 1:{
                int a, b;
                fin >> a >> b;
                fout << read(b)-read(a-1) << "\n";
                break;
            }case 2:{
                int lf, st = 1, dr = n, m, ans = -1;
                fin >> lf;
                for (m = (st+dr)/2; st <= dr; m = (st+dr)/2){
                    int val = read(m);
                    if(val == lf){
                        ans = m;
                        dr = m-1;
                    }else if (val < lf)
                        st = m+1;
                    else dr = m-1;
                }
                fout << ans << "\n";
                break;
            }
        }
    }
    return 0;
}