Cod sursa(job #1796338)

Utilizator NinjaCubeMihai Radovici NinjaCube Data 3 noiembrie 2016 13:02:30
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

typedef unsigned int uint;

main() {
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    uint n, m, k;
    cin>>n>>m;
    k = ceil(sqrt(n))+2;
    vector<uint> a(n), b(ceil(n/k)+1);
    fill(a.begin(), a.end(), 0);
    fill(b.begin(), b.end(), 0);
    for (uint i = 0; i < n; i++) {
        cin>>a[i];
        b[i/k]+=a[i];
    }
    uint op, x, y;
    for (uint i = 0; i < m; i++) {
        cin>>op;
        if (op == 0) {
            cin>>x>>y;
            x--;
            a[x] += y;
            b[x/k] += y;
        }
        if (op == 1) {
            cin>>x>>y;
            x--;
            uint s = 0;
            uint j = x;
            while (j<y && j%k>0) {
                s+=a[j];
                j++;
            }
            while (j+k<y) {
                s+=b[j/k];
                j+=k;
            }
            while (j<y) {
                s+=a[j];
                j++;
            }
            cout<<s<<"\n";
        }
        if (op == 2) {
            cin>>x;
            uint s = 0;
            uint j = 0;
            while (j+k<a.size() && s+b[j/k] <= x) {
                s+=b[j/k];
                j+=k;
            }
            while (j<a.size() && s+a[j] <= x) {
                s+=a[j];
                j++;
            }
            while (j>0 && a[j-1] == 0) {
                j--;
            }
            if (j >= a.size()) {
                j = a.size();
            }
            if (x>0 && a[0] > 0 && s == x) {
                cout<<j<<"\n";
            } else {
                cout<<-1<<"\n";
            }
        }
    }
}