Cod sursa(job #2568559)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 4 martie 2020 01:29:13
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair

using namespace std;

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

int aib[201005];
int n,m;

void add(int poz,int val){
    int i;
    for(i = poz; i <= n; i += (i&-i)){
        aib[i] += val;
    }
}

int sum(int poz){
    int i,sum = 0;
    for(i = poz; i >= 1; i -= (i&-i)){
        sum += aib[i];
    }
    return sum;
}

int query(int a,int b){
    return sum(b) - sum(a-1);
}

int sumsrc(int val){
    int st = 1,dr = n,mid,summid,sol = 100000000;
    while(st <= dr){
        mid = (st+dr)/2;
        summid = sum(mid);
        if(val < summid){
            dr = mid-1;
        }else if(val == summid){
            sol = min(sol,mid);
            dr = mid-1;
        }else if(summid < val){
            st = mid+1;
        }
    }
    if(sol == 100000000){
        return -1;
    }
    return sol;
}

int main()
{
    int i,c,a,b,aux;
    fin>>n>>m;
    for(i = 1; i <= n; i++){
        fin>>aux;
        add(i,aux);
    }
    for(i = 1; i <= m; i++){
        fin>>c;
        if(c == 0){
            fin>>a>>b;
            add(a,b);
        }else if(c == 1){
            fin>>a>>b;
            fout<<query(a,b)<<'\n';
        }else if(c == 2){
            fin>>a;
            fout<<sumsrc(a)<<'\n';
        }
    }
    return 0;
}