线段树求调(re + wa只过了样例)
查看原帖
线段树求调(re + wa只过了样例)
895690
gghack_Nythix楼主2023/8/24 13:57
#include<bits/stdc++.h>
#define lid (id << 1)
#define rid (id << 1 | 1)
using namespace std;
char buf[1 << 20],*p1,*p2;
#define getc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2)?0:*p1++)
int read(){
	int x = 0,w = 1;
	char c = 0;
	while(c < '0' || c > '9'){
		if(c == '-')w = -1;
		c = getc();
	}
	while(c <= '9' && c >= '0'){
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getc();
	}
	return x * w;
}
inline void print(register long long x){
	if(x < 0){
		x = -x;
		putchar('-');
	}
	if(x > 9)print(x / 10);
	putchar(x % 10 + 48);
}
struct segmt{
	int id,l,r;
	int lazy,sum;
}tr[5000005];
int a[5000005];
int sum[5000005];
int n,m;
void pushup(int id){
	tr[id].sum = tr[lid].sum + tr[rid].sum;
}
void pushdown(int id,int l,int r){
	if(tr[id].lazy){
		int mid = (l + r) >> 1;
		tr[lid].sum += tr[id].lazy * (mid - l + 1);
		tr[rid].sum += tr[id].lazy * (r - mid);
		tr[lid].lazy += tr[id].lazy;
		tr[rid].lazy += tr[id].lazy;
		tr[id].lazy = 0;
	}
}
void bulid(int id,int l,int r){
	//tr[id].l = l;
	//tr[id].r = r;
	if(l == r){
		tr[id].sum = a[l];
		return ;
	}
	int mid = (l + r) >> 1;
	bulid(lid,l,mid);
	bulid(rid,mid + 1,r);
	pushup(id);
}
void change(int id,int l,int r,int val,int ll = 1,int rr = n){
	if(ll >= l && rr <= r){
		tr[id].sum += (rr - ll + 1) * val;
		tr[id].lazy += val;
		return ;
	}
	pushdown(id,ll,rr);
	int mid = (ll + rr) >> 1;
	if(l <= mid){
		change(lid,l,r,val,ll,mid);
	}
	if(r > mid){
		change(rid,l,r,val,mid + 1,rr);
	}
	pushup(id);
}
int querysum(int id,int l,int r,int ll = 1,int rr = n){
	int ans = 0;
	if(ll >= l && rr <= r){
		return tr[id].sum;
	}
	pushdown(id,ll,rr);
	int mid = (ll + rr) >> 1;
	if(r <= mid){
		ans += querysum(lid,l,r,ll,mid);
	}
	if(l > mid){
		ans += querysum(rid,l,r,mid + 1,rr);
	}
	return ans;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i <= n;++i){
		cin >> a[i];
		a[i] += a[i - 1];
	}
	bulid(1,1,n);
	while(m--){
		string oper;
		register int x,y;
		cin >> oper >> x;
		if(oper == "Modify"){
			cin >> y;
			register int ax = 0;
			if(x == 1)ax = querysum(1,1,1);
			if(x == 2)ax = querysum(1,1,2) - (querysum(1,1,1) << 1);
			else ax = querysum(1,1,x) + querysum(1,1,x - 2) - (querysum(1,1,x - 1) << 1);
			change(1,x,n,y - ax);
		}
		else {
			cout <<  querysum(1,1,x) << endl;
		}
	}
	return 0;
}
2023/8/24 13:57
加载中...