Cod sursa(job #2444770)

Utilizator MatteoalexandruMatteo Verzotti Matteoalexandru Data 1 august 2019 13:17:57
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
// C++
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <deque>
#include <ctime>
#include <map>
#include <chrono>
#include <cmath>
#define INF 0x3f3f3f3f
#define MAX(a,b) a>b ? a:b
#define MIN(a,b) a<b ? a:b
#define lsb(i) i&(-i)

using namespace std;

const int N = 100000;

int n;
int aib[5 + N];

void Update(int nod,int val)
{
    for(int i=nod; i<=n; i+=lsb(i))
        aib[i] += val;
}

int GetSum(int nod)
{
    int s = 0;
    for(int i=nod; i>=1; i-=lsb(i))
        s += aib[i];
    return s;
}

void cb(int x, int &rez)
{
    int r, pas, cursum = 0;
    r = 0;
    pas = 1<<20;
    while(pas){
        if(r + pas <= n && cursum + aib[r+pas] <= x){
            r += pas;
            cursum += aib[r];
        }
        pas >>= 1;
    }
    if(cursum == x) rez = r;
    else rez = -1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int q, i, nr, rez;
    scanf("%d%d", &n, &q);
    for(i=1; i<=n; i++)
    {
        scanf("%d", &nr);
        Update(i,nr);
    }
    for(i=1; i<=q; i++){
        int c, a, b;
        scanf("%d%d", &c, &a);
        if(c == 0){
            scanf("%d", &b);
            Update(a,b);
        }
        else if(c == 1){
            scanf("%d", &b);
            int suma, sumb;
            sumb = GetSum(b);
            suma = GetSum(a-1);
            printf("%d\n",sumb-suma);
        }
        else{
            cb(a, rez);
            printf("%d\n",rez);
        }
    }
    return 0;
}