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
Beləliklə, dərinliyi olan bütün düyünlər aşağıdakı intervalları təşkil edir:
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ı
bərabərdir
Eyni dərinlik olan bütün düyünləri eyni -ni töhfə verir, beləliklə sorğunun cavabı
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:
və son səviyyə qismidir:
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";
}
}