Cod sursa(job #1703139)

Utilizator TonisonIlle Antoniu Nicolae Tonison Data 16 mai 2016 12:48:45
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");
#define MAXN 15000
int N,M;
int Arb[MAXN]={};
int val, poz, suma=0, start, stop;

int lsb(int arg)
{
    return arg&(-arg);
}

void update(int pozitia, int valoare)
{
    while(pozitia<=N)
    {
        Arb[pozitia]+=valoare;
        pozitia+=lsb(pozitia);
    }
}

int query(int pozitia)
{
    int ans=0;
    while(pozitia)
    {
        ans+=Arb[pozitia];
        pozitia-=lsb(pozitia);
    }
    return ans;
}

int query(int a, int b) {
    return query(b)-query(a-1);
}

void afisare_arbust()
{
    for(int i=1; i<=20; ++i)
    {
        cout<<Arb[i]<<" ";
    }
    cout<<"\n";
}

void updatte(int n, int st, int dr)
{
    if(st==dr)
    {
        Arb[n]+=val;
        return;
    }
    else
    {
        int m=(st+dr)/2;
        if(poz<=m)
            updatte(2*n, st, m);
        else
            updatte(2*n+1,m+1,dr);
        Arb[n]=Arb[2*n]+Arb[2*n+1];
    }
}



int querry(int x, int st, int dr)
{
    if(start<=st && dr<=stop)
    {
        return Arb[x];
    }
    int m=(st+dr)/2, mid=(start+stop)/2;
    if(st<=mid && mid<dr)   return querry(2*x,st,mid)+querry(2*x+1, mid+1, dr);
    if(start<=m)    return querry(2*x,st,m);
    if(m<stop)      return querry(2*x+1, m+1, dr);
}

int main()
{
    f>>N>>M;
    int x,a,b;
    for(int i=1; i<=N; ++i)
    {
        f>>x;
        poz=i;
        val=x;
        //updatte(1,1,N);
        update(i,x);
        //afisare_arbust();
    }

    for(int i=1; i<=M; ++i)
    {
        f>>x>>a>>b;
        if(x==1)
        {
            suma=0;
            start=a;
            stop=b;
            //g<<querry(1,1,N);
            g<<query(a,b);
            g<<"\n";
        }
        else
        {
            poz=a;
            val=-b;
            //updatte(1,1,N);
            update(poz,val);
        }
    }

    return 0;
}