Cod sursa(job #1507963)

Utilizator LurchssLaurentiu Duma Lurchss Data 22 octombrie 2015 08:55:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define nmax 15005
using namespace std;
int A,B;
int Poz,Val,X;
int Arb[nmax*4];
int n,m,maxim;
void Update(int n,int left,int right)
{
    if(left==right)
    {
        Arb[n]=Arb[n]-B;
        return;
    }
    int mij=(left+right)/2;
    if(Poz<=mij)
        Update(2*n,left,mij);
    else Update(2*n+1,mij+1,right);
    Arb[n]=Arb[2*n]+Arb[2*n+1];
}

void Query(int n,int left,int right)
{
    if(A<=left && right<=B)
    {
        maxim+=Arb[n];
        return;
    }
    int mij=(left+right)/2;
    if(A<=mij)
        Query(2*n,left,mij);
    if(B>mij)
        Query(2*n+1,mij+1,right);
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d ",&X);
        Poz=i;
        B=-X;
        Update(1,1,n);
    }

    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&X,&A,&B);
        if(X==0)
        {
            Poz=A;
            Update(1,1,n);
        }
        else
        {
            maxim=0;
            Query(1,1,n);
            printf("%d\n",maxim);
        }
    }
    return 0;
}