蒟蒻表示不理解:这个题数据范围是 1e5 ,我线段树数组开到 N(1e5+5) * 4 ,RE 了,改成 N = 1e6+5 就过了 why???why???why???
#include<bits/stdc++.h>
using namespace std;
typedef long long lol;
const int N = 1e5+5, mod = 1e9+7;
int n, m;
lol tmp[2][2];
struct mrx
{
lol d[2][2] = {};
void set (int &a, int &b)
{
d[0][0] = a, d[0][1] = b;
}
void set_A ()
{
d[0][0] = d[1][0] = d[1][1] = 1;
}
void set_B ()
{
d[0][0] = d[0][1] = d[1][1] = 1;
}
void turn_ard ()
{
swap (d[0][0], d[1][1]);
swap (d[0][1], d[1][0]);
}
void multi (mrx &a, mrx &b)
{
memset (tmp, 0, sizeof tmp);
for (int i = 0; i < 2; ++ i )
for (int j = 0; j < 2; ++ j )
{
for (int k = 0; k < 2; ++ k )
tmp[i][j] += a.d[i][k] * b.d[k][j] % mod;
tmp[i][j] %= mod;
}
memcpy (d, tmp, sizeof d);
}
void out_put ()
{
printf ("%lld %lld\n", d[0][0], d[0][1]);
}
} str[N];
struct brc
{
mrx x;
bool rev_flg = false;
} tr[N * 4];
void push_up (int u)
{
tr[u].x.multi(tr[u << 1].x, tr[u << 1 | 1].x);
}
void push_down (int u)
{
if (tr[u].rev_flg)
{
tr[u].rev_flg = false;
tr[u << 1].x.turn_ard ();
tr[u << 1 | 1].x.turn_ard ();
tr[u << 1].rev_flg ^= 1;
tr[u << 1 | 1].rev_flg ^= 1;
}
}
void build (int u, int l, int r)
{
if (l == r)
tr[u].x = str[l];
else
{
int mid = (l + r) >> 1;
build (u << 1, l, mid);
build (u << 1 | 1, mid + 1, r);
push_up (u);
}
}
void modify (int u, int l, int r, int &lft, int &rht)
{
push_down (u);
if (lft <= l && r <= rht)
{
tr[u].x.turn_ard();
tr[u].rev_flg ^= 1;
}
else
{
int mid = (l + r) >> 1;
if (mid >= lft) modify (u << 1, l, mid, lft, rht);
if (mid < rht) modify (u << 1 | 1, mid + 1, r, lft, rht);
push_up (u);
}
}
mrx query (int u, int l, int r, int lft, int rht)
{
push_down (u);
if (lft <= l && r <= rht)
{
return tr[u].x;
}
else
{
int mid = (l + r) >> 1;
if (mid >= rht) return query (u << 1, l, mid, lft, rht);
if (mid < lft) return query (u << 1 | 1, mid + 1, r, lft, rht);
mrx lx = query (u << 1, l, mid, lft, rht), rx = query (u << 1 | 1, mid + 1, r, lft, rht);
lx.multi (lx, rx);
return lx;
}
}
int main ()
{
freopen ("in.txt", "r", stdin);
scanf ("%d%d\n", &n, &m);
for (int i = 1; i <= n; ++ i )
{
char c = getchar();
if (c == 'A')
str[i].set_A();
else
str[i].set_B();
}
build (1, 1, n);
while (m -- )
{
int op, l, r;
scanf ("%d%d%d", &op, &l, &r);
if (op == 1)
modify (1, 1, n, l, r);
else
{
int a, b;
scanf ("%d%d", &a, &b);
mrx x, y = query (1, 1, n, l, r);
x.set (a, b);
x.multi(x, y);
x.out_put ();
}
}
return 0;
}