#include <iostream> #include <math.h> #include <stdint.h> #define maxim 50001 using namespace std; int32_t nrq, frecv[maxim+1], sol[maxim], maxi, sqrtm; int32_t rr[maxim], l, r, l_c, r_c, rez; struct queryy { int32_t a, b, sol, in; }q[maxim], aux; int16_t numar(int32_t nr, int16_t cif) { int32_t aux=nr; int16_t rez=0; while(aux!=0) { if(aux%10==cif) rez++; aux/=10; } return rez; } void frecventa() { int32_t i, nr4, nr7; for(i=1; i<maxim; i++) { nr4=numar(i, 4); nr7=numar(i, 7); frecv[i]=frecv[i-1]+ nr4-nr7; } } void query() { int32_t i, gap, j; ios_base::sync_with_stdio(false); cin>>nrq; for(i=1; i<=nrq; i++) { cin>>q[i].a>>q[i].b; if(maxi< q[i].b) maxi= q[i].b; q[i].in=i; } sqrtm= sqrt(maxi); for(gap=nrq/2; gap>=1; gap/=2) for(i=1+gap; i<=nrq; i++) { aux=q[i]; for(j=i-gap; (j>=1)&&((q[j].a/ sqrtm> aux.a/ sqrtm)||((q[j].a/ sqrtm== aux.a/ sqrtm)&&(q[j].b> aux.b))); j-=gap) q[j+gap]=q[j]; q[j+gap]=aux; } } void afisare() { int32_t i; for(i=1; i<=nrq; i++) sol[q[i].in]=q[i].sol; for(i=1; i<=nrq; i++) cout<<sol[i]<<"\n"; } void add_dr(int32_t poz) { rez+=rr[frecv[poz]]; rr[frecv[poz]]++; } void delete_dr(int32_t poz) { rr[frecv[poz]]--; rez-=rr[frecv[poz]]; } void add_st(int32_t poz) { rez+=rr[frecv[poz-1]]; rr[frecv[poz]]++; } void delete_st(int32_t poz) { rr[frecv[poz]]--; rez-=rr[frecv[poz-1]]; } void actualizare() { int32_t i; if(r_c< r) for(i=r; i>r_c; i--) delete_dr(i); else for(i=r+1; i<=r_c; i++) add_dr(i); if(l_c< l) for(i=l_c; i<l; i++) add_st(i); else for(i=l; i<l_c; i++) delete_st(i); l=l_c; r=r_c; } void mo() { int32_t i; l=1; r=1; rr[0]=2; rez=1; //rr[x]= nr el cu frecv= x din intervalul l, r //rez= nr subintervale speciale din l,r for(i=1; i<=nrq; i++) { l_c=q[i].a; r_c=q[i].b; actualizare(); q[i].sol=rez; } } int main() { frecventa(); query(); mo(); afisare(); return 0; }