Cod sursa(job #992233)

Utilizator tanduraDomnita Dan tandura Data 1 septembrie 2013 15:14:43
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
using namespace std;

FILE *f=fopen("datorii.in","r");
FILE *g=fopen("datorii.out","w");

vector<int>v;
int n,m;

void adauga(int p,int val)
{
    int k,poz;
    while(p<=n)
    {
        v.at(p)+=val;
        k=0;
        poz=p;
        while(poz%2==0)
            k++, poz/=2;
        if(k==0)
            p++;
        else
            p+=(2<<(k-1));
    }
}

long interogare(int p)
{
    long sum=0;
    int poz,k;
    while(p)
    {
        sum+=v.at(p);
        k=0;
        poz=p;
        while(poz%2==0)
            k++, poz/=2;
        if(k==0)
            p--;
        else
            p-=(2<<(k-1));
    }
    return sum;
}

int main()
{
    int t,p,val,dela,panala;
    fscanf(f,"%d%d",&n,&m);
    v.resize(n+1,0);
    for(int i=1;i<=n;i++)
    {
        fscanf(f,"%d",&val);
        adauga(i,val);
    }
    for(int i=1;i<=m;i++)
    {
        fscanf(f,"%d",&t);
        if(t==0)
        {
            fscanf(f,"%d%d",&p,&val);
            adauga(p,-val);
        }
        else
        {
            fscanf(f,"%d%d",&dela,&panala);
            fprintf(g,"%d\n",interogare(panala)-interogare(dela-1));
        }
    }
    return 0;
}