Cod sursa(job #2476510)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 19 octombrie 2019 00:44:35
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <iostream>
#define zeros(x) ((x^(x-1))&x)
using namespace  std;

int n,m;
long long aib[100010];

int update(int poz,int value)
{
    for(int i=poz;i<=n;i+=zeros(i) )
        aib[i]+=value;
}

int sum(int poz)
{
    int sum=0;
    for(int i=poz;i;i-=zeros(i))
        sum+=aib[i];
    return sum;
}


int poz(int val)
{
    int p,poz;
    for(p=1;p<=n;p<<=1);
    for(poz=0;p>0;p>>=1)
    {
        if(poz+p <= n)
            if(sum(poz+p)<=val) poz+=p;
    }
    if(sum(poz) !=val) return -1;
    if(poz==0) return -1;
    return poz;
}

int main()
{
    ifstream t1("aib.in");
    ofstream t2("aib.out");
    t1>>n>>m;
    int i,j,tip,a,b;
    for(i=1;i<=n;i++)
    {
        t1>>a;
        update(i,a);
    }
    for(i=1;i<=m;i++)
    {
        t1>>tip;
        if(tip==2) t1>>a;
        else t1>>a>>b;
        if(tip==0) update(a,b);
        if(tip==1) t2<<sum(b)-sum(a-1)<<'\n';
        if(tip==2) t2<<poz(a)<<'\n';
    }
    t1.close();
    t2.close();
    return 0;
}