Cod sursa(job #1267102)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 19 noiembrie 2014 15:20:58
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 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;

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

    return 0;
}