3343: 教主的魔法
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1038 Solved: 454
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4
Sample Output
3
HINT
Source
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1000005;
const int MAXM = 1005;
char c[5];
int a[MAXN], i, j, n, k, m, block[MAXM][MAXM], cnt[MAXM], x, y, w, ans;
inline int get()
{
char c;
while ((c = getchar()) < 48 || c > 57);
int res = c - 48;
while ((c = getchar()) >= 48 && c <= 57)
res = res * 10 + c - 48;
return res;
}
int main()
{
cin >> n >> m;
for(i = 1; i <= n; i ++)
a[i] = get();
int nn = sqrt(n);
nn += (n % nn != 0);
for(i = 1; i <= nn; i ++)
{
for(j = (i - 1) * nn + 1, k = 1; j <= i * nn; j ++, k ++)
block[i][k] = a[j];
sort(block[i] + 1, block[i] + nn + 1);
}
for(i = 1; i <= m; i ++)
{
scanf("%s", c);
x = get(); y = get(); w = get();
if (x > y) swap(x, y);
int bx = x / nn + (x % nn != 0);
int by = y / nn + (y % nn != 0);
if (c[0] == 'M')
{
if (bx == by)
{
for(j = x; j <= y; j ++)
a[j] += w;
k = 1;
for(j = (bx - 1) * nn + 1; j <= bx * nn; j ++, k ++)
block[bx][k] = a[j];
sort(block[bx] + 1, block[bx] + 1 + nn);
continue;
}
if (bx < by - 1)
{
for(j = bx + 1; j <= by - 1; j ++)
cnt[j] += w;
}
for(j = x; j <= bx * nn; j ++)
a[j] += w;
for(j = nn * (by - 1) + 1; j <= y; j ++)
a[j] += w;
k = 1;
for(j = (bx - 1) * nn + 1; j <= nn * bx; j ++, k ++)
block[bx][k] = a[j];
k = 1;
for(j = (by - 1) * nn + 1; j <= nn * by; j ++, k ++)
block[by][k] = a[j];
sort(block[bx] + 1, block[bx] + 1 + nn);
sort(block[by] + 1, block[by] + 1 + nn);
}
else
{
ans = 0;
if (bx == by)
{
for(j = x; j <= y; j ++)
ans += (a[j] + cnt[bx] >= w);
printf("%d\n", ans);
continue;
}
if (bx < by - 1)
{
for(j = bx + 1; j <= by - 1; j ++)
{
int c = w - cnt[j];
int l = 1, r = nn;
while (l != r - 1)
{
if (l == r) break;
int mid = (l + r) >> 1;
if (block[j][mid] >= c) r = mid;
else l = mid;
}
if (block[j][l] >= c) ans += nn - l + 1;
else if (block[j][r] >= c) ans += nn - r + 1;
}
}
for(j = x; j <= bx * nn; j ++)
ans += (a[j] + cnt[bx] >= w);
for(j = (by - 1) * nn + 1; j <= y; j ++)
ans += (a[j] + cnt[by] >= w);
printf("%d\n", ans);
}
}
}