首页 > 其他分享 >Can you answer these queries III(单点修改线段树)

Can you answer these queries III(单点修改线段树)

时间:2024-09-29 18:12:04浏览次数:8  
标签:info typedef these sum rmax int lmax queries answer

因为洛谷出现UE在acwing提交,输入格式略有修改

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
const int N = 500010;
int n,q;
int a[N];
struct info
{
	int sum,lmax,rmax,maxn;
};
info operator + (const info& l,const info& r)
{
	info a;
	a.sum = l.sum + r.sum;
	a.lmax = max(l.lmax,l.sum+r.lmax);
	a.rmax = max(r.rmax,r.sum+l.rmax);
	a.maxn = max({l.maxn, r.maxn, a.lmax, a.rmax, l.rmax+r.lmax});
	return a;
}
struct node
{
	int l,r;
	info val;
}tr[N<<2];
void pushup(int p)
{
	tr[p].val = tr[p<<1].val + tr[p<<1|1].val;
}
void build(int l,int r,int p)
{
	tr[p].l = l,tr[p].r = r;
	if(l==r)
	{
		tr[p].val = {a[l],a[l],a[l],a[l]};
		return ;
	}
	int m = (l+r)/2;
	build(l,m,p<<1);
	build(m+1,r,p<<1|1);
	pushup(p);
}
void update(int x,int d,int p)
{
	int l = tr[p].l, r = tr[p].r;
	if(l==r)
	{
		tr[p].val = {d,d,d,d};
		return ;
	}
	int m = (l+r)/2;
	if(x<=m) update(x,d,p<<1);
	else update(x,d,p<<1|1);
	pushup(p);
}
info query(int x,int y,int p)
{
	int l = tr[p].l,r = tr[p].r;
	if(x==l&&r==y) return tr[p].val;
	info ans;
	int m = (l+r)/2;
	if(y<=m) return query(x,y,p<<1);
	else if(x>m) return query(x,y,p<<1|1);
	else return query(x,m,p<<1)+query(m+1,y,p<<1|1);
}
void solve()
{
	cin>>n>>q;
	for(int i=1;i<=n;++i) cin>>a[i];
	build(1,n,1);
	//cin>>q;
	for(int i=1;i<=q;++i)
	{
		int op;
		cin>>op;
		if(op==2)
		{
			int x,d;
			cin>>x>>d;
			update(x,d,1);
		}
		else
		{
			int x,y;
			cin>>x>>y;
			if(x>y) swap(x,y);
			auto res = query(x,y,1);
			cout<<res.maxn<<'\n';
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T=1;
	//cin>>T;
	while(T--)
	{
		solve();
	}
}


标签:info,typedef,these,sum,rmax,int,lmax,queries,answer
From: https://www.cnblogs.com/ruoye123456/p/18440549

相关文章

  • 2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数
    2024-09-18:用go语言,给定一个从0开始的长度为n的正整数数组nums和一个二维操作数组queries,每个操作由一个下标值indexi和一个数值ki组成。开始时,数组中的所有元素都是未标记的。依次执行m次操作,每次操作的过程如下:1.如果下标indexi对应的元素还未标记,则标记这个元素......
  • 158.337 Queries (SQL/LINQ), Triggers
    158.337GroupProjectInstructions:PartB(Coursemark- 17.5%)Youwillcontinuetoworkingroups*forthisassignment.Youdonotneedto registeragain but in case you change your group membership please let us know via emailing Indu (i......
  • CF1526F Median Queries 题解
    Description本题是一道交互题。给定\(n\),你需要猜测一个长度为\(n\)的排列\(p\)(即\(p\)包含所有\(1\)到\(n\)的整数各一次)。已知\(p\)满足\(p_1<p_2\)。当然,你可以进行询问,每次询问你需要给定三个互不相同的整数\(a,b,c\),交互器会返回\(|p_a-p_b|,|p_b-p_c|,|p_......
  • SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffer
    SQLSTATE[HY000]:Generalerror:2014Cannotexecutequerieswhileotherunbufferedqueriesareactive.ConsiderusingPDOStatement::fetchAll().Alternatively,ifyourcodeisonlyevergoingtorunagainstmysql,youmayenablequerybufferingbysetting......
  • 2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数
    2024-09-18:用go语言,给定一个从0开始的长度为n的正整数数组nums和一个二维操作数组queries,每个操作由一个下标值indexi和一个数值ki组成。开始时,数组中的所有元素都是未标记的。依次执行m次操作,每次操作的过程如下:1.如果下标indexi对应的元素还未标记,则标记这个元素......
  • 开源多场景问答社区论坛Apache Answer本地部署并发布至公网使用
    ......
  • G1: Yunli‘s Subarray Queries (easy version)(1900)(定长区间众数)
    思路:因为是定长区间,因此我们可以利用滑动窗口维护定长区间的众数的数量AC代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintMOD=998244353;constintN=2e5+10;lla[N];llb[N];//前i个数的相同的数的最大值intmain(){......
  • ABC246Ex 01? Queries(动态 DP)
    题意给定长度为\(n\)的字符串\(s\),只包含0,1,?,其中?可以任意替换为0和1。再给定\(q\)次单点修改,修改后查询字符串本质不同的子序列个数,对\(998244353\)取模。\(n,q\le10^5\)分析考虑没有修改怎么做。首先跟SA没有任何关系。设\(f_{i,0/1}\)表示考虑前\(......
  • GCD Queries
    GCDQueries交互题。发现一个结论:对于三个数\(a,b,c\),我们询问\(ga=\gcd(a,c),gb=\gcd(b,c)\)。若\(ga=gb\),则\(c\not=0\)若\(ga>gb\),则\(b\not=0\)若\(ga<gb\),则\(a\not=0\)也就是说,进行两次询问可以排除掉一个位置,那么我们一共只需要进行\(2(n-2)\)次询......
  • 线段树can you answer these queries-------hdu4027
    问题描述:给定一个数列,要求对指定区间内所有数开方,输出查询区间和输入:有很多个测试用例,每个用例第一行输出一个整数N,表示数列有N个数,1<=N<=100000;第二行输入N个整数E,E<2e63;第三行输入整数M,表示M种操作,1<=M<=100000;之后的M行,每行输入3个整数TXY。T=0,表示修改,将区间[L,R]内所......