Description
Input
Output
每次x=1时,每行一个整数,表示这次旅行的开心度
Sample Input
4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4
Sample Output
101
11
11
11
11
HINT
对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9
Source
一颗线段树码出来, 对于每个修改,找到单点修改即可。
没了。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#define N 100010
#define ll long long
#define lson l, mid, lx
#define rson mid + 1, r, rx
using namespace std;
struct Tree
{
int l, r;
ll sum;
bool flag;
}t[N * 4];
int n, m;
inline int read()
{
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
void build(int l, int r, int rt)
{
t[rt].l = l;
t[rt].r = r;
int lx = rt << 1, rx = rt << 1 | 1;
if(l == r)
{
t[rt].sum = read();
t[rt].l = t[rt].r = t[rt].sum;
if(t[rt].sum == 0 || t[rt].sum == 1)
t[rt].flag = 1;
return;
}
int mid = (l + r) >> 1;
build(lson);
build(rson);
t[rt].sum = t[lx].sum + t[rx].sum;
t[rt].flag = t[lx].flag & t[rx].flag;
}
ll query(int l, int r, int rt, int x, int y)
{
if(l == x && r == y) return t[rt].sum;
int mid = (l + r) >> 1;
int lx = rt << 1, rx = rt << 1 | 1;
if(mid < x) return query(rson, x, y);
else if(mid >= y) return query(lson, x, y);
else return query(lson, x, mid) + query(rson, mid + 1, y);
}
void update(int l, int r, int rt, int x, int y)
{
if(t[rt].flag == 1) return;
if(l == r)
{
t[rt].sum = sqrt(t[rt].sum);
if(t[rt].sum == 0 || t[rt].sum == 1)
t[rt].flag = 1;
return;
}
int lx = rt << 1, rx = rt << 1 | 1;
int mid = (l + r) >> 1;
if(mid >= y) update(lson, x, y);
else if(mid < x) update(rson, x, y);
else update(lson, x, mid), update(rson, mid + 1, y);
t[rt].sum = t[lx].sum + t[rx].sum;
t[rt].flag = t[lx].flag & t[rx].flag;
}
int main()
{
n = read();
build(1, n, 1);
m = read();
for(int i = 1; i <= m; i ++)
{
int f, x, y;
f = read();
x = read();
y = read();
if(x > y) swap(x, y);
switch(f)
{
case 1:printf("%lld\n", query(1, n, 1, x, y));break;
case 2:update(1, n, 1, x, y);break;
}
}
return 0;
}