 # CF Edu Round 110 Div 2, Problem D, help with TLE

So I think that my solution to this problem: Problem - D - Codeforces runs in O(qn) time, which should run under 2 seconds, but it seems to not work. What is going wrong?

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

typedef long long ll;
#define F0R(i, n) for (int i = 0; i < n; i++)
#define R0F(i, n) for (int i = n-1; i >= 0; i--)
#define FOR(i, a, n) for (int i = a; i < n; i++)
#define pb push_back
#define fastio ios::sync_with_stdio(0); cin.tie(0)
#define FMOD 998244353
#define MOD 1000000007
int n;
const int MAXN = 1<<18;
int a[MAXN] = {0};

int solve(string s, int g, int level) {
int left = 2*g; // 0 means left
int right  = 2*g+1; // 1 means right
if (s[g-1]=='1') {
if (level==n-1) {
a[g-1]=1;
return 1;
}
else {
a[g-1]=solve(s, left, level+1);
solve(s, right, level+1);
}
} else if (s[g-1]=='0') {
if (level==n-1) {
a[g-1]=1;
return 1;
}
else {
a[g-1]=solve(s, right, level+1);
solve(s, left, level+1);
}
} else {
if (level==n-1) {
a[g-1]=2;
return 2;
}
else {
a[g-1]=solve(s, left, level+1)+solve(s, right, level+1);
}
}
return a[g-1];
}

int main() {
fastio;
cin >> n;
int x = 1<<n;
string s; cin >> s;
reverse(s.begin(), s.end());
solve(s, 1, 0);

int q; cin >> q;
F0R(i, q) {
int c; char t; cin >> c >> t;
s[x-1-c]=t;
c = x-c;
if (2*c>=x) {
if (t=='?') a[c-1]=2;
else a[c-1]=1;
c/=2;
}
do {
if (s[c-1]=='?') a[c-1]=a[2*c-1]+a[2*c];
else if (s[c-1]=='1') a[c-1]=a[2*c-1];
else a[c-1]=a[2*c];
c=c/2;
} while (c>0);
// if (s[c-1]=='?') a[c-1]=a[2*c-1]+a[2*c];
// else if (s[c-1]=='1') a[c-1]=a[2*c-1];
// else a[c-1]=a[2*c];
cout << a << "\n";

// F0R(i, x) {
//     cout << a[i] << " ";
// }
// cout << "\n";
// cout << s << "\n";

// cout << "\n\n\n\n";

}
}
``````

Found the problem. It was passing in the string s to the recursion each time almost quadrupled the time (actually way more than that, it was exponentially worse).