Cod sursa(job #1258154)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 8 noiembrie 2014 15:45:58
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
//#include <iostream>
#include <stdio.h>
#define nmax 100001
using namespace std;
FILE *f=fopen("arbint.in","r"),*g=fopen("arbint.out","w");
int a,b,n,arb[4*nmax],poz,val;
inline int maxi(int a,int b)
{
    if(a<b)
    return b;
    return a;

}
int query(int nod, int st, int dr)
{int mijl,sum=0;
    if(st==dr)
    return arb[nod];
    mijl=(st+dr)/2;
    if(a<=mijl)
        sum+=query(nod*2,st,mijl);
    if(b>mijl)
    sum+=query(nod*2+1,mijl+1,dr);
    return sum;

}
void update(int nod, int st, int dr)
{
    int mijl=(st+dr)/2;
    if(st==dr)
    arb[nod]-=val;
    else {
        if(poz<=mijl)
            update(nod*2,st,mijl);
        else
            update(nod*2+1,mijl+1,dr);
        arb[nod]=arb[nod*2]+arb[nod*2+1];
        }
}
int main()
{
    int i,j,m,t,p=1,maxim;
    fscanf(f,"%d %d",&n,&m);
    while(p<n)
    p*=2;
    for(i=1;i<=n;i++)
    {fscanf(f,"%d",&val);
    val=-val;
    poz=i;
    update(1,1,p);
    }
    for(j=1;j<=m;j++)
    {
        fscanf(f,"%d %d %d",&t,&a,&b);
        if(t==1)
            fprintf(g,"%d\n",query(1,1,p));
        else {
            poz=a;
            val=b;
            update(1,1,p);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}