Cod sursa(job #1235701)

Utilizator tdr_drtTdr Drt tdr_drt Data 30 septembrie 2014 12:30:47
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<fstream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int n,m,v[15002],h[45002],s;

void build(int nod,int x,int y)
{
    int m=(x+y)/2;
    if(x==y) h[nod]=v[x];
    else
    {
        build(nod*2,x,m);
        build(nod*2+1,m+1,y);
        h[nod]=h[nod*2]+h[nod*2+1];
    }
}

void change(int nod,int x,int y,int pos,int val)
{
    int m=(x+y)/2;
    if(x==y) h[nod]=max(h[nod]-val,0);
    else
    {
        if(pos<=m) change(nod*2,x,m,pos,val);
       else change(nod*2+1,m+1,y,pos,val);
       h[nod]=h[nod*2]+h[nod*2+1];
    }
}

int ask(int nod,int x,int y,int xi,int yi)
{
    if(xi<=x&&yi>=y) return h[nod];
    int m=(x+y)/2,s=0;
    if(xi<=m)
    {
        s+=ask(nod*2,x,m,xi,yi);
    }
    if(yi>m)
    {
        s+=ask(nod*2+1,m+1,y,xi,yi);
    }
    return s;
}

void read()
{
    f>>n>>m;
    for(int i=1;i<=n;i++) f>>v[i];
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int ok,xi,yi;
        f>>ok>>xi>>yi;
        if(ok==1) g<<ask(1,1,n,xi,yi)<<"\n";
        else change(1,1,n,xi,yi);
    }

}

int main(){
 read();
 return 0;
}