Cod sursa(job #2871690)

Utilizator DordeDorde Matei Dorde Data 15 martie 2022 15:12:48
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 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 , a , b , c , d;
struct aib{
  #define z(x) ((x)&(-x))
  int v[N + 1];
  aib(){fill(v , v + N + 1 , 0);}
  void add(int p , int x){
    for(int i = p ; i <= N ; i += z(i))
      v[i] += x;
  }
  int sum(int p){
    if(p < 0) return 0;
    int r = 0;
    for(int i = p ; i ; i -= z(i))
      r += v[i];
    return r;
  }
  int query(int l , int r){
    if(l > r)
      swap(l , r);
    return sum(r) - sum(l - 1);
  }
}tL , tC;
int main()
{
    fin >> q;
    for(int i = 1 ; i <= q ; ++ i){
        fin >> tip;
        if(tip == 1){
          fin >> co >> val;
          tC.add(co , val);
        }
        if(tip == 2){
          fin >> co >> val;
          tL.add(co , val);
        }
        if(tip == 3){
          fin >> a >> b >> c >> d;
          if(a == c && b == d){
            fout << fixed << setprecision(10) << 1.0 * tC.query(a , c) + tL.query (b , d) << '\n';
            continue;
          }
          if(a == c){
              ldb vy = 1.0 / abs(b - d);
              fout << fixed << setprecision(10) << 1.0 * tC.query(a , c) + vy * tL.query(b , d) << '\n';
          }else{
            if(b == d){
                ldb vx = 1.0 / abs(c - a);
                fout << fixed << setprecision(10) << 1.0 * tC.query(a , c) * vx + tL.query(b , d) << '\n';
            }else{
              ldb vx = 1.0 / abs(c - a);
              ldb vy = 1.0 / abs(b - d);
              fout << fixed << setprecision(10) << vx * tC.query(a , c) + vy * tL.query(b , d) << '\n';
            }
          }
        }
    }
    return 0;
}