Cod sursa(job #2433895)

Utilizator georgeoctavianGeorge Octavian Grumazescu georgeoctavian Data 29 iunie 2019 17:22:08
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,aib[100010],a,b,x,nr;
int qry(int p)
{
    int s=0;
    while(p)
    {
        s+=aib[p];
        p-=p&(-p);
    }
    return s;
}
void upd(int p, int val)
{
    while(p<=n)
    {
        aib[p]+=val;
        p+=p&(-p);
    }
}
int findd(int val)
{
    int r=0,pas=pow(2,16),x=val;
    if(qry(n)<val)
        return -1;
    while(pas)
    {
        if(r+pas<=n&&aib[r+pas]<val)
        {
            r+=pas;
            val-=aib[r];
        }
        pas/=2;
    }
    if(qry(r+1)!=x)
        return -1;
    else return r+1;
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>nr;
        upd(i,nr);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>nr;
        if(nr==0)
        {
            fin>>a>>b;
            upd(a,b);
        }
        if(nr==1)
        {
            fin>>a>>b;
            fout<<qry(b)-qry(a-1)<<'\n';
        }
        if(nr==2)
        {
            fin>>a;
            fout<<findd(a)<<'\n';
        }
    }
    return 0;
}