Cod sursa(job #3252294)

Utilizator laura2020Moldovan Laura laura2020 Data 29 octombrie 2024 10:01:50
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");
#define dim 15005
#define dim_bucket 130
int v[dim],n,bucket_size,b[dim_bucket];
void init()
{
    int i,j;
    j=1;
    for(i=1;i<=n;i++)
    {
        b[(i-1)/bucket_size+1]+=v[i];
    }
}
void update(int x,int y)
{
    ///din ziua x scadem y
    v[x]-=y;
    b[(x-1)/bucket_size+1]-=y;
}
int query(int x,int y)
{
    int i,sum=0,bx,by;
    if(y-x<bucket_size)
    {
        for(i=x;i<=y;i++)
            sum+=v[i];
        return sum;
    }
    bx=(x-1)/bucket_size+1;
    by=(y-1)/bucket_size+1;
    for(i=bx+1;i<by;i++) ///bucket-urile complete
        sum+=b[i];
    for(i=x;i<=bx*bucket_size;i++) ///bucket-ul incomplet al lui x
        sum+=v[i];
    for(i=(by-1)*bucket_size+1;i<=y;i++) ///bucket-ul incomplet al lui y
        sum+=v[i];
    return sum;
}

int main()
{
    int m,x,y,i;
    bool op;
    fin>>n>>m;
    bucket_size=sqrt(n);
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    init();
    for(i=1;i<=m;i++)
    {
        fin>>op>>x>>y;
        if(op==0)
        {
            ///update
            update(x,y);
        }
        else if(op==1)
        {
            ///query
            fout<<query(x,y)<<'\n';
        }
    }
    return 0;
}