2Tree Sorğuları#12314

2Tree Sorğuları (Həll təhlili)

Problem Müəllifi:

Hasan Saleh (MathModel)

Hazırlayan:

Hasan Saleh (MathModel)

Redaktə edən:

Hasan Saleh (MathModel)

Həll

Tree-də, düyünü və 2u+1 uşaqlarına malikdir. Dərinlik -ə çatmaq üçün kənarların sayıdır, belə ki

\mathrm{depth}(x)=\lfloor \log_2 x \rfloor.

Beləliklə, dərinliyi olan bütün düyünlər aşağıdakı intervalları təşkil edir:

[2^y,\;2^{y+1}-1].

Bizə və (a,b,c,d) sorğuları verilib, və biz sıralı cütlərini saymalıyıq ki: 1\le u\le v\le n, -nin atasıdır, \mathrm{depth}(u)\in[a,b], \mathrm{depth}(v)\in[c,d].

\mathrm{depth}(v)=y sabitləşdirin. Onda -nin hər dərinlikdə 0,1,\dots,y tam bir atası var, beləliklə intervalında dərinliyi olan ataların sayı

[a,b]\cap[0,y]

bərabərdir

f(y)=\max\bigl(0,\;\min(b,y)-a+1\bigr).

Eyni dərinlik olan bütün düyünləri eyni -ni töhfə verir, beləliklə sorğunun cavabı

\sum_{y=c}^{d} \mathrm{cnt}[y]\cdot f(y),

burada arasında dərinliyi olan düyünlərin sayıdır.

D=\lfloor \log_2 n \rfloor maksimum dərinlikdir. 0\le y < D üçün səviyyə tamdır:

\mathrm{cnt}[y]=2^y,

və son səviyyə qismidir:

\mathrm{cnt}[D]=n-2^D+1.

Hər bir sorğu üçün, əgər c>D cavab -dır, və d=\min(d,D)-ni sıxırıq. Sonra y=c..d arasında iterasiya edirik: mx=\min(b,y) qoyun, əgər mx\ge a isə (mx-a+1)\cdot \mathrm{cnt}[y] əlavə edin.

D\le 56 olduğu üçün n\le 10^{17}, hər bir sorğu -dir, yəni təxminən əməliyyat, bu da q\le 10^6 üçün sürətlidir.

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    long long n; int q;
    cin>>n>>q;

    int D=63-__builtin_clzll((unsigned long long)n);

    vector<long long> cnt(D+1);
    for(int y=0;y<D;y++)cnt[y]=1LL<<y;
    cnt[D]=n-(1LL<<D)+1;

    while(q--){
        long long a,b,c,d;
        cin>>a>>b>>c>>d;

        if(c>D){cout<<0<<"\n";continue;}
        if(d>D)d=D;

        long long ans=0;
        for(long long y=c;y<=d;y++){
            long long mx=min(b,y);
            if(mx>=a)ans+=(mx-a+1)*cnt[y];
        }
        cout<<ans<<"\n";
    }
}