Cod sursa(job #1944283)

Utilizator KOzarmOvidiu Badea KOzarm Data 29 martie 2017 08:05:46
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>

using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");

struct el
{
    int st,dr,val;
}v[50003];

int n,m,p,q,x;
bool t;


void preformatare(int st,int dr,int poz)
{
    v[poz].st=st;
    v[poz].dr=dr;
    if(st!=dr)
    {
        preformatare(st,(st+dr)/2,2*poz);
        preformatare((st+dr)/2+1,dr,2*poz+1);
    }
}

void adauga(int i,int val,int poz)
{
    while(v[poz].st!=v[poz].dr)
    {
        v[poz].val+=val;
        if(v[2*poz].dr>=i)
            poz=2*poz;
        else
            poz=2*poz+1;
    }
    v[poz].val+=val;
}


int suma(int st,int dr,int poz)
{
    if(v[poz].st>=st&&v[poz].dr<=dr)
        return v[poz].val;
    else
    {
        int sum=0;
        if((v[2*poz].dr>=st&&v[2*poz].st<=dr) || (v[2*poz].st<=dr&&v[2*poz].dr>=st))
            sum+=suma(st,dr,2*poz);
        if((v[2*poz+1].dr>=st&&v[2*poz+1].st<=dr) || (v[2*poz+1].st<=dr&&v[2*poz+1].dr>=st))
            sum+=suma(st,dr,2*poz+1);
        return sum;
    }
}


int main()
{
    fin>>n>>m;
    preformatare(1,n,1);
    for(int i=1;i<=n;i++)
    {
        fin>>x;
        adauga(i,x,1);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>t>>p>>q;
        if(t==0)
            adauga(p,-q,1);
        else
            fout<<suma(p,q,1)<<"\n";
    }
    return 0;
}