Cod sursa(job #1796655)

Utilizator topala.andreiTopala Andrei topala.andrei Data 3 noiembrie 2016 17:36:08
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <iostream>
#include <stdio.h>
using namespace std;
FILE*f=freopen("datorii.in","r",stdin);
FILE*g=freopen("datorii.out","w",stdout);
int n,m,v[280000],sum,a,b,o,pos;
char buff[290000];
void citire(int &nr)
{
    while(buff[pos] < '0' || buff[pos] > '9') if(++pos == 290000) fread(buff, 1, 290000, stdin), pos = 0;
    nr = 0;
    while('0' <= buff[pos] && buff[pos] <= '9')
    {
        nr = nr * 10 + buff[pos] - '0';
        if(++pos == 290000) fread(buff, 1, 290000, stdin), pos = 0;
    }
}

void update(int nod,int l,int r)
{
    v[nod]+=b;
    if(l==r)
    return;
    int mij=(l+r)/2;
    if(a<=mij)
    update(2*nod,l,mij);
    else
    update(2*nod+1,mij+1,r);
}
void query(int nod,int l,int r)
{
    if(a<=l&&b>=r)
    {
        sum+=v[nod];
        return;
    }
    int mij=(l+r)/2;
    if(a<=mij)
    query(2*nod,l,mij);
    if(b>mij)
    query(2*nod+1,mij+1,r);
}
int main()
{
    citire(n);
    citire(m);
    for(a=1;a<=n;a++)
    {
        citire(b);
        update(1,1,n);
    }
    while(m--)
    {
        citire(o);
        citire(a);
        citire(b);
        if(o==0)
        {
            b=-b;
            update(1,1,n);
        }
        else
        {
            sum=0;
            query(1,1,n);
            printf("%d\n",sum);
        }
    }
    return 0;
}