Cod sursa(job #2641516)

Utilizator Savu_Stefan_CatalinSavu Stefan Catalin Savu_Stefan_Catalin Data 11 august 2020 18:20:05
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#define ub(i) (i&(-i))
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n,m,i,x,a,b,aib[200005];
void update(int a,int b)
{
    for (int i=a;i<=n;i+=ub(i))
        aib[i]+=b;
}
int query(int a)
{
    int sum=0;
    for (int i=a;i>=1;i-=ub(i))
        sum+=aib[i];
    return sum;
}
int query2(int a)
{
    int i=1,sum=0;
    while (i<=n) i=(i<<1);
    i=(i>>1);
    if (i==n) {if (aib[i]==a) return i; i=(i>>1);}
    for (;i;i=(i>>1))
        if (aib[sum+ub(i)]<=a&&sum+ub(i)<=n) {a=a-aib[sum+ub(i)]; sum+=ub(i);}
    if (a!=0) return -1;
    return sum;
}
int main()
{
ios_base::sync_with_stdio(0);
in.tie();
out.tie();
in>>n>>m;
for (i=1;i<=n;++i)
{
    in>>x;
    update(i,x);
}
for (i=1;i<=m;++i)
{
    in>>x>>a;
    if (x==0) {in>>b; update(a,b);}
    if (x==1) {in>>b; out<<query(b)-query(a-1)<<'\n';}
    if (x==2) {out<<query2(a)<<'\n';}
}
    return 0;
}