Cod sursa(job #2024511)

Utilizator DdariusDarius Ddarius Data 20 septembrie 2017 19:29:22
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");\

#define zeros(x)(x&(-x))

int v[100100], n, m, a, b, i, q, AIB[100100];

void add(int x, int hm)
{
    for(int i=x; i<=n; i+=zeros(i))
    {
        AIB[i]+=hm;
    }
}
int calc(int x)
{
    int i, sum=0;
    for(i=x; i>0; i-=zeros(i))
         sum+=AIB[i];
    return sum;
}
int cb(int x)
{
    int st=0, dr=n+1, mid;
    while(dr-st>1)
    {
        mid=(st+dr)/2;
        if(calc(mid)<=x)
        {
            st=mid;
        }
        else
        {
            dr=mid;
        }
    }
    if(st>=n+1||st==0||calc(st)!=x)
        return -1;
    return st;
}

int main()
{
    f>>n>>m;
    for(i=1; i<=n; i++)
    {
        f>>v[i];
        add(i, v[i]);
    }
    for(i=1; i<=m; i++)
    {
        f>>q;
        if(q==0)
        {
            f>>a>>b;
            add(a, b);
        }
        if(q==1)
        {
            f>>a>>b;
            g<<calc(b)-calc(a-1)<<'\n';
        }
        if(q==2)
        {
            f>>a;
            g<<cb(a)<<'\n';
        }
    }
    return 0;
}