Cod sursa(job #2105648)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 13 ianuarie 2018 19:58:27
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
#define zero(x) ((x^(x-1))&x)
const int nmax=100000;
int n,q,v[nmax+5],aib[nmax+5];
void add(int poz,int value)
{
    for(int i=poz;i<=n;i+=zero(i))
        aib[i]+=value;
}
int prefix(int poz)
{
    int sum=0;
    for(int i=poz;i>=1;i-=zero(i))
        sum+=aib[i];
    return sum;
}
int main()
{
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        int a;
        cin>>a;
        add(i,a);
    }
    for(int i=1;i<=q;i++)
    {
        int tip,a,b;
        cin>>tip;
        if(tip==0)
        {
            cin>>a>>b;
            add(a,b);
        }
        if(tip==1)
        {
            cin>>a>>b;
            cout<<prefix(b)-prefix(a-1)<<"\n";
        }
        if(tip==2)
        {
            cin>>a;
            int r=0,pas=(1<<16);
            while(pas)
            {
                if(r+pas<=n and prefix(r+pas)<a)
                    r+=pas;
                pas/=2;
            }
            r++;
            if(prefix(r)==a)
                cout<<r<<"\n";
            else
                cout<<"-1\n";
        }
    }
    return 0;
}
/**
**/