Cod sursa(job #1267113)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 19 noiembrie 2014 15:32:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#include <vector>

int size;
std::vector<int> v;
void insert(int poz, int x)
{
    for(; poz<v.size(); poz+= poz&(~(poz-1)))
    {
        v[poz]+=x;
    }
}
int sum(int a, int b)
{
    int s=0;
    for(int poz = b;poz;poz-=poz&(~(poz-1)))
    {
        s+=v[poz];
    }
    for(int poz = a-1; poz; poz-=poz&(~(poz-1)))
    {
        s-=v[poz];
    }
    return s;
}
int main ()
{
    FILE *fin=fopen("aib.in","r");
    FILE *fout = fopen("aib.out","w");
    int n, m;
    fscanf(fin, "%d%d", &n, &m);

    for (size = 1;size<=n;size*=2) {}
    v.resize(size);
    for(int i=1;i<=n;i++)
    {
        int temp;
        fscanf(fin, "%d", &temp);
        insert(i,temp);
    }

    int a,b,opt;
    for(int i=1;i<=m;i++)
    {
        fscanf(fin,"%d", &opt);    
        if(opt==0)
        {
           fscanf(fin, "%d%d", &a, &b); 
           insert(a,b);
        }
        else if(opt==1)
        {
            fscanf(fin, "%d%d", &a, &b); 
            fprintf(fout, "%d\n",sum(a,b));
        }
        else
        {
            fscanf(fin, "%d", &a); 
            int poz= 1;
            int sum = 0;

            for(poz=1; 2*poz<=n && v[poz*2]<=a; poz*=2)
            {
            }
            sum+=v[poz];
            for(int pas = poz/2; pas; pas/=2)
            {
                if(poz+pas<=n and sum+v[poz+pas]<=a)
                {
                    sum+=v[poz+pas];
                    poz+=pas;
                }
            }
            if(sum==a)
            {
                fprintf(fout,"%d\n",poz);
            }
            else
            {
                fprintf(fout,"-1\n");
            }
        }
    }

    return 0;
}