题目链接:点击打开链接
输入没有告知一行几个数字有点坑爹,所以用字符串读入一行,空格数判断数字个数
然后sscanf走起来
。。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <queue>
#include <functional>
#include <iostream>
using namespace std;
#define ll long long
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define N 200010
inline ll Mid(ll x, ll y){return (x+y)>>1;}
struct node{
ll l, r;
ll add, minn;
}tree[N<<4];
ll a[N];
void push_down(ll id){
if(tree[id].l == tree[id].r)return ;
if(tree[id].add)
{
tree[L(id)].minn += tree[id].add;
tree[R(id)].minn += tree[id].add;
tree[L(id)].add += tree[id].add;
tree[R(id)].add += tree[id].add;
tree[id].add = 0;
}
}
void push_up(ll id){
tree[id].minn = min(tree[L(id)].minn, tree[R(id)].minn);
}
void build(ll l, ll r, ll id){
tree[id].l = l; tree[id].r = r;
tree[id].add = tree[id].minn = 0;
if(l == r)
{
tree[id].minn = a[l];
return ;
}
ll mid = Mid(l, r);
build(l, mid, L(id));
build(mid+1, r, R(id));
push_up(id);
}
void updata(ll l, ll r, ll val, ll id){
push_down(id);
if(l == tree[id].l && tree[id].r == r)
{
tree[id].minn += val;
tree[id].add += val;
return ;
}
ll mid = Mid(tree[id].l, tree[id].r);
if(mid < l)
updata(l, r, val, R(id));
else if(r <= mid)
updata(l, r, val, L(id));
else
{
updata(l, mid, val, L(id));
updata(mid+1, r, val, R(id));
}
push_up(id);
}
ll query(ll l, ll r, ll id){
push_down(id);
if(l == tree[id].l && tree[id].r == r)
return tree[id].minn;
ll mid = Mid(tree[id].l, tree[id].r);
if(mid < l)
return query(l, r, R(id));
else if(r <= mid)
return query(l, r, L(id));
return min(query(l, mid, L(id)), query(mid+1, r, R(id)));
}
char s[100];
ll siz(){
ll space = 0;
for(int i = 0; s[i]; i++)if(s[i]==' ')space++;
return space;
}
ll n, m;
int main(){
ll i, j, u, v, val;
while(cin>>n){
for(i = 1; i <= n; i++)scanf("%I64d",&a[i]);
build(1, n, 1);
cin>>m; getchar();
while(m--){
gets(s);
if(siz() == 1)
{
sscanf(s, "%I64d %I64d", &u, &v);
u++; v++;
if(u <= v)
cout<<query(u, v, 1)<<endl;
else
cout<<min(query(1, v, 1), query(u, n, 1))<<endl;
}
else
{
sscanf(s, "%I64d %I64d %I64d", &u, &v, &val);
u++; v++;
if(u <= v)
updata(u, v, val, 1);
else
{
updata(u, n, val, 1);
updata(1, v, val, 1);
}
}
}
}
return 0;
}