Cod sursa(job #1427816)

Utilizator retrogradLucian Bicsi retrograd Data 3 mai 2015 02:27:41
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<iostream>
#include<cstdio>

using namespace std;
typedef int var;


#define DIM 100000
char buff[DIM];
var poz;
void Read(var &a) {
    while(!isdigit(buff[poz]))
        if(++poz == DIM)
            cin.read(buff, DIM), poz=0;
    a = 0;
    while(isdigit(buff[poz])) {
        a = a * 10 + buff[poz] - '0';
        if(++poz == DIM)
            cin.read(buff, DIM), poz=0;
    }
}

#define COUNT 100000
#define SIZE 300

var Buck[COUNT];
var V[100005];
var n;

void Add(var ind, var val) {
    V[ind] += val;
    Buck[ind/SIZE] += val;
}

var Query(var b, var e) {
    var sum = 0;
    var i;
    for(i=b; i%SIZE; i++) {
        if(i>e) return sum;
        sum += V[i];
    }
    for(var c=i/SIZE;i+SIZE-1<=e;i+=SIZE,c++)
        sum += Buck[c];
    for(;i<=e;i++)
        sum += V[i];
    return sum;
}

var Query2(var val) {
    var i=0;

    for(var c=0; val>Buck[c]; i+=SIZE, c++) {
        val -= Buck[c];
        if(i>n) return -1;
    }
    for(;val;val-=V[i++])
        if(i>n+1)
            return -1;
    if(val)
        return -1;
    return i-1;
}

int main() {
    var m;

    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    cin.read(buff, DIM);

    Read(n);
    Read(m);

    for(var i=1; i<=n; i++) {
        Read(V[i]);
        Buck[i/SIZE] += V[i];
    }

    var type, a, b;

    while(m--) {
        Read(type);
        switch(type) {
        case 0:
            Read(a);
            Read(b);
            Add(a, b);
            break;
        case 1:
            Read(a);
            Read(b);
            cout<<Query(a, b)<<'\n';
            break;
        case 2:
            Read(a);
            cout<<Query2(a)<<'\n';
            break;
        }
    }

    return 0;
}