Cod sursa(job #2872015)

Utilizator DordeDorde Matei Dorde Data 16 martie 2022 10:37:51
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>
#define ldb long double
using namespace std;
ifstream fin("dulciuri.in");
ofstream fout("dulciuri.out");
int const N = 1e6;
int q , tip , co , val ;
int xs , ys , xf , yf;
ldb _abs(ldb A){
    if(! A)
        return 1.0;
    return (A > 0 ? A : -A);
}
struct aib{
  #define z(x) ((x)&(-x))
  ldb v[N + 2];
  aib(){fill(v , v + N + 1 , 0);}
  void add(int p , ldb x){
    for(int i = p ; i <= N + 1 ; i += z(i))
      v[i] += x;
  }
  ldb sum(int p){
    if(p == -1) return 0.0;
    ldb r = 0.0;
    for(int i = p ; i ; i -= z(i))
      r += v[i];
    return r;
  }
  ldb query(int l , int r){
    if(l > r)
      swap(l , r);
    return sum(r) - sum(l - 1);
  }
}tL , tC;
int main()
{
    fin >> q;
    int cnt = 0;
    for(int i = 1 ; i <= q ; ++ i){
        fin >> tip;
        if(tip == 1){
          fin >> co >> val;
          tC.add(co + 1 , val);
        }
        if(tip == 2){
          fin >> co >> val;
          tL.add(co + 1 , val);
        }
        if(tip == 3){
            fin >> xs >> ys >> xf >> yf;
            if(xs > xf) swap(xs , xf);
            if(ys > yf) swap(ys , yf);
            ++ xs , ++ ys , ++ xf , ++ yf;
            if(xs == xf && ys == yf){
                fout << fixed << setprecision(10) << tL.query(xs , xs) + tC.query(ys , ys) << '\n';
            }else{
                if(xs == xf){
                    fout << fixed << setprecision(10) << tC.query(xs , xs) + tL.query(ys , yf - 1) / abs(yf - ys) << '\n';
                }else{
                    if(ys == yf){
                        fout << fixed << setprecision(10) << tC.query(xs , xf - 1) / abs(xs - xf) + tL.query(ys , ys) << '\n';
                    }else{
                        fout << fixed << setprecision(10) << tC.query(xs , xf - 1) / abs(xs - xf) + tL.query(ys , yf - 1) / abs(ys - yf) << '\n';
                    }
                }
            }
        }
    }
    return 0;
}