Cod sursa(job #1861258)

Utilizator DoubleNyNinicu Cristian DoubleNy Data 28 ianuarie 2017 18:56:11
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <bits/stdc++.h>
using namespace std;
#define ios ios_base::sync_with_stdio(false);cin.tie(0);
#define setnow clock_t tStart=clock();
#define time (double)(clock() - tStart)/CLOCKS_PER_SEC;
//#define setin(x) ifstream cin(x);
//#define setout(x) ofstream cout(x);
typedef long long ll;
typedef long long int lli;
typedef pair < int, int> dbl;
const int maxInt = 1e9*2;
const lli maxLong = 1e18*2;
int val[100010];
int n, m;
#define cnt(x) ( (x ^ (x - 1)) & x )


int count0(int a){
        int sum = 0;
        for(int i = a;i > 0;i-=cnt(i))
                sum+=val[i];
        return(sum);
}
void update(int a, int b){
        for(int i = a;i <= n;i+=cnt(i)){
                    val[i]+=b;

        }
}

int find0(int a){
        int mid, left = 1, right = n;
        while(left <= right){
                mid = (left + right) / 2;
                int calc = count0(mid);
                if(calc < a)
                        left = mid + 1;
                if(calc > a)
                        right = mid - 1;
                if(calc == a)
                        return(mid);
        }
        return -1;
}

int main(){
        freopen("aib.in", "r", stdin);
        freopen("aib.out", "w", stdout);
        scanf("%d %d", &n, &m);
        val[0] = 0;
        for(int i = 1; i <= n; i++){
                  int x;
                  scanf("%d", &x);
                  update(i, x);
        }
        for(int i = 0; i < m; i++){
                    int type;
                    scanf("%d", &type);
                    if(type == 0){
                            int a, b;
                            scanf("%d %d", &a, &b);
                            update(a, b);
                    }
                    if(type == 1){
                            int a, b;
                            scanf("%d %d", &a, &b);
                            int sum = count0(b) - count0(a - 1);
                            printf("%d", sum);
                    }

                    if(type == 2){
                            int a;
                            scanf("%d", &a);
                            printf("%d", find0(a));
                    }
        }
}