This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
struct letras{
	int a, t, c;
};
struct con{
	int at,ac,ta,tc,ca,ct;
};
template<class T, T m_(T, T)> struct IterativeSegmentTree{
  int n; vector<T> ST;
  IterativeSegmentTree(){}
  IterativeSegmentTree(vector<T> &a){
    n = a.size(); ST.resize(n << 1);
    for (int i=n;i<(n<<1);i++)ST[i]=a[i-n];
    for (int i=n-1;i>0;i--)ST[i]=m_(ST[i<<1],ST[i<<1|1]);
  }
  void update(int pos, T val){ // replace with val
    ST[pos += n] = val;
    for (pos >>= 1; pos > 0; pos >>= 1)
      ST[pos] = m_(ST[pos<<1], ST[pos<<1|1]);
  }
  T query(int l, int r){ // [l, r]
    T ansL, ansR; bool hasL = 0, hasR = 0;
    for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1) {
      if (l & 1) 
        ansL=(hasL?m_(ansL,ST[l++]):ST[l++]),hasL=1;
      if (r & 1) 
        ansR=(hasR?m_(ST[--r],ansR):ST[--r]),hasR=1;
    }
    if (!hasL) return ansR; if (!hasR) return ansL;
    return m_(ansL, ansR);
  }
}; // Give vector of leaves and merge function
int merge(int a, int b){
    return a+b;
}
letras merge2(letras a, letras b){
  letras c;
  c.a=a.a+b.a;
  c.t=a.t+b.t;
  c.c=a.c+b.c;
  return c;
}
con merge3(con a, con b){
  con c;
  c.at=a.at+b.at;
  c.ac=a.ac+b.ac;
  c.ta=a.ta+b.ta;
  c.tc=a.tc+b.tc;
  c.ca=a.ca+b.ca;
  c.ct=a.ct+b.ct;
  return c;
}
vector<int>aaa;
IterativeSegmentTree<int,merge>st(aaa);
vector<letras>bbb;
IterativeSegmentTree<letras,merge2>la(bbb);
IterativeSegmentTree<letras,merge2>lb(bbb);
vector<con>ccc;
IterativeSegmentTree<con,merge3>cc(ccc);
void init(string a, string b){
	vector<int>diff(a.length());
	for(int i=0;i<a.length();i++){
		if(a[i]!=b[i])diff[i]=1;
		else diff[i]=0;
	}
	IterativeSegmentTree<int,merge>s(diff);
	st=s;
  vector<letras>aa(a.length());
  vector<letras>bb(b.length());
  for(int i=0;i<a.length();i++){
		if(a[i]=='C')aa[i].c=1;
    else if(a[i]=='A')aa[i].a=1;
    else if(a[i]=='T')aa[i].t=1;
    if(b[i]=='C')bb[i].c=1;
    else if(b[i]=='A')bb[i].a=1;
    else if(b[i]=='T')bb[i].t=1;
	}
  IterativeSegmentTree<letras,merge2>cla(aa);
  IterativeSegmentTree<letras,merge2>clb(bb);
  la=cla;
  lb=clb;
  vector<con>ccccc(a.length());
  for(int i=0;i<a.length();i++){
    con c;
    c.at=0;
    c.ac=0;
    c.ta=0;
    c.tc=0;
    c.ca=0;
    c.ct=0;
		if(a[i]=='A'&&b[i]=='C'){
      c.ac=1;
    }
    else if(a[i]=='A'&&b[i]=='T'){
      c.at=1;
    }
    else if(a[i]=='T'&&b[i]=='C'){
      c.tc=1;
    }
    else if(a[i]=='T'&&b[i]=='A'){
      c.ta=1;
    }
    else if(a[i]=='C'&&b[i]=='T'){
      c.ct=1;
    }
    else if(a[i]=='C'&&b[i]=='A'){
      c.ca=1;
    }
    ccccc[i]=c;
	}
  IterativeSegmentTree<con,merge3>cccc(ccccc);
  cc=cccc;
}
int get_distance(int x, int y){
  if(la.query(x,y).a!=lb.query(x,y).a||la.query(x,y).c!=lb.query(x,y).c||la.query(x,y).t!=lb.query(x,y).t){
    return -1;
  }
  else{
    int sum=0;
    con q=cc.query(x,y);
    int min_ca=min(q.ac,q.ca);
    int max_ca=max(q.ac,q.ca);
    sum+=min_ca;
    int min_at=min(q.at,q.ta);
    int max_at=max(q.at,q.ta);
    sum+=min_at;
    int min_ct=min(q.tc,q.ct);
    int max_ct=max(q.tc,q.ct);
    sum+=min_ct;
    sum+=((max_ct-min_ct)*2);
    return sum;
  }
}
Compilation message (stderr)
dna.cpp: In member function 'T IterativeSegmentTree<T, m_>::query(int, int)':
dna.cpp:30:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   30 |     if (!hasL) return ansR; if (!hasR) return ansL;
      |     ^~
dna.cpp:30:29: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   30 |     if (!hasL) return ansR; if (!hasR) return ansL;
      |                             ^~
dna.cpp: In function 'void init(std::string, std::string)':
dna.cpp:68:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |  for(int i=0;i<a.length();i++){
      |              ~^~~~~~~~~~~
dna.cpp:76:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |   for(int i=0;i<a.length();i++){
      |               ~^~~~~~~~~~~
dna.cpp:89:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |   for(int i=0;i<a.length();i++){
      |               ~^~~~~~~~~~~
dna.cpp: In function 'int get_distance(int, int)':
dna.cpp:128:9: warning: unused variable 'max_ca' [-Wunused-variable]
  128 |     int max_ca=max(q.ac,q.ca);
      |         ^~~~~~
dna.cpp:131:9: warning: unused variable 'max_at' [-Wunused-variable]
  131 |     int max_at=max(q.at,q.ta);
      |         ^~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |