Cod sursa(job #2134908)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 18 februarie 2018 13:46:16
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 15005

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

int n,m,v[nmax],arb[nmax<<2],mx,mxg;

void build(int nod,int poz,int val,int st,int dr)
{
    int mid=(st+dr)/2;
    if (st==dr&&st==poz)
    {
        arb[nod]=val;
        return;
    }
    if (poz<=mid)
        build(nod*2,poz,val,st,mid);
    else
        build(nod*2+1,poz,val,mid+1,dr);
    arb[nod]=arb[nod*2]+arb[nod*2+1];
}

void query(int nod,int margst,int margdr,int st,int dr)
{
    int mid=(st+dr)/2;
    if (margst<=st&&dr<=margdr)
    {
        if (margst==st&&margdr==dr)
            {mx=arb[nod];
            return;}
        mx+=arb[nod];
        return;
    }
    if (st>margdr||dr<margst)
        return;
    query(nod*2,margst,margdr,st,mid);
    query(nod*2+1,margst,margdr,mid+1,dr);
}

void read()
{
    fscanf(f,"%d %d",&n,&m);
    for (int i=1; i<=n; ++i)
    {
        fscanf(f,"%d",&v[i]);
        build(1,i,v[i],1,n);
    }
    for (int i=1; i<=m; ++i)
    {
        int a,b,c;
        fscanf(f,"%d %d %d",&a,&b,&c);
        if (a==0)
        {
            v[b]=max(v[b]-c,0);
            build(1,b,v[b],1,n);
        }
        else
        {
            mx=0;
            query(1,b,c,1,n);
            fprintf(g,"%d\n",mx);
        }
    }
}

int main()
{
    read();
    fclose(f);
    fclose(g);
    return 0;
}