Cod sursa(job #1163222)

Utilizator bogobatBerbece Daniel bogobat Data 1 aprilie 2014 11:26:05
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<fstream>
#include <iostream>
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int s,t,x,y,m,n,i,a[15001],h[60000];
void completare(int nod,int st,int dr)
{
    int m=(st+dr)>>1;
    if(st==dr)
    {
        h[nod]=a[st];
        return ;
    }
    completare(2*nod,st,m);
    completare(2*nod+1,m+1,dr);
    h[nod]=h[2*nod]+h[2*nod+1];
}
void update(int start,int fin,int nod)
{
    int m=(start+fin)>>1;
    if(start==fin)
    {
        h[nod]-=y;
        return ;
    }
    if(m>=x)
    update(start,m,2*nod);
    else
    update(m+1,fin,2*nod+1);
    h[nod]=h[2*nod]+h[2*nod+1];
}
void query(int nod,int in,int sf)
{
    int m=(in+sf)>>1;
    if(in>=x&&y>=sf)
    {
        s+=h[nod];
        return ;
    }
    if(x<=m)
    query(2*nod,in,m);
    if(y>m)
    query(2*nod+1,m+1,sf);
}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
    f>>a[i];
    completare(1,1,n);
    for(i=1;i<=m;++i)
    {
        f>>t>>x>>y;
        if(t==1)
        {
            s=0;
            query(1,1,n);
            g<<s<<endl;
        }
        else
        update(1,n,1);
    }
    return 0;
}